2010-01-22 20 views
6

Şimdiye kadar hep şöyle bir responds_to bloğunu kullanarak eylemler için tepki biçimini belirttiniz:Her zaman responses_to?

responds_to do |format| 
    format.js { render :json => @record } 
end 

Son zamanlarda ben fark ettim ki sadece (yukarıdaki örnekte olduğu gibi) bir biçimini destekleyen, sen don Bu bloğa gerçekten ihtiyacım var. Onu bırakmak ya da çıkarmak için en iyi uygulama mı?

cevap

2

Ben CEVAPLARI- mevcut farklılık gidiyorum:

render :json => @record 

çok daha özlü daha mı - Tüm eylemlerim için responds_to bloğuna sahip olmayı seviyorum. Bunu biraz daha fazla olsa da, eylemi daha net bir şekilde belgeliyor. Ayrıca gelecekte ek formatları desteklemeyi kolaylaştırır. Düzenleme: başka bir avantajı bir geçit yöneticisi gibi davranır. Blokta bildirilmeyen formatlar otomatik olarak bir "406 Kabul Edilemez" olarak sunulur

+0

Kapı bekçisi fikrini düşünmemiştim, hoş olanı. –

+0

, bu durumda benim örneğimde, bir istek (html için, .js olmadan) bir 406 ve sadece doğru başlık olmadan sadece bir kayıt jsonu alacak mıdır? eğer öyleyse bu büyük ... – tfwright

+0

Evet, senin 'responses_to' bloğu ile yukarıda, .xml, .html vb. için bir istek' 406 Kabul Edilemez 'olmalıdır. – Ben

0

Bunun en iyi uygulama olup olmadığından emin değilim, ancak genellikle yapmayı sevdiğim yanıtları response_to'ya açık bırakmak (yani, .:format sonuna kadar ekleyerek), ancak yalnızca denetleyicilerinde kullanmaktır gerekli olduğunda.

Örnek:

routes.rb

map.connect :controller/:action/:id.:format 

model_controller.rb

# Return a collection of model objects 
def action_with_multiple_responses 
    @models = Model.all 

    respond_to do |format| 
    format.html #=> action_with_multiple_responses.html 
    format.xml { render :xml => @models } 
    end 
end 

# Return the first model object 
def action_with_one_response 
    @model = Model.first 
end 

Bu şekilde, gereksiz bir bloğu ile action_with_one_response yöntemini yığılan değil ama sen istersen kendini çok güzel ayarlamışsın bir gün içinde nesneyi xml, json, vb. şeklinde döndürün.

+0

Sanırım: format varsayılan olarak eklenir. – vise

+1

Eğer 'map.resources' kullanırsanız, ama sadece 'map.connect' kullanırsanız bunun olduğuna inanmıyorum - en azından, bu benim deneyimim oldu (başka bir şey yapmadığım sürece). – jerhinesmith

+0

Evet, map.resources belirtilen denetleyiciye bağlı RESTful rotaların bir taslağını ayarlayacaktır. Bağlan, belirtilen biçimde belirli bir yol oluşturur. –

0

Birden çok yanıt türünüz olmadıkça response_to kullanmamayı tercih ederim.

sadece ekstra anlamak için kod ve uygulama işlemek için ve tanıtıcı geçerli:

responds_to do |format| 
    format.js { render :json => @record } 
end