Rails 4.2+ için güncelleme
#respond_with
ve ::respond_to
( nb sınıfı yöntemi) artık Rails'in bir parçası değildir . Bunlar , Rails 4.2'den itibaren üçüncü taraf yanıtlayıcı gemisine taşındı ( Ağustos 2014 tarihli sürüm notları / taahhüt ). Yanıt verenler varsayılan olarak Rails'e dahil edilmese de, bu bir Devise bağımlılığıdır ve bu nedenle birçok Rails uygulamasında kullanılabilir.
#respond_to
Örnek yöntemi, ancak, yine de Raylar bir kısmı (bu yazının yazıldığı gibi 5.2rc1).
ActionController::MimeResponds
Nasıl #respond_to
çalıştığını açıklamak için resmi Rails API belgeleri . Orijinal Rails Guides dokümantasyonu yorumları yanıtlayanların mücevher kaynak kodunda bulunabilir #respond_with
ve ::respond_to
hala bulunabilir .
Orijinal Cevap
Yanıtlayıcılar için kod, bir sınıf ve bir modüle dayalıdır. MimeResponds içine dahil edilir ActionController :: Base , sınıfında ApplicationController
devralır. Sonra da response_with kullanılırken varsayılan davranışı sağlayan ActionController :: Responsder vardır.
Varsayılan olarak, yanıtta sağlanan tek davranış, eylemle eşleşen bir ada sahip bir şablon oluşturmaya yönelik örtük bir girişimdir. Bunun ötesinde herhangi bir şey, eylem içinde daha fazla talimat veya birden fazla format yanıtını işlemek için bir blokla özel bir yanıt çağrısı gerektirir.
Çoğu denetleyici oldukça yaygın bir özelleştirme modeli kullandığından, yanıt verenler daha fazla varsayılan davranış sunarak ekstra bir soyutlama düzeyi sağlar. Belirli formatlar için to_xml / to_json çağrısı yapan eylemleri ve başarılı mutatör eylemleri için aynı şeyi ve yeniden yönlendirmeleri sağlayan mutatör eylemlerini okuyun.
Müdahale edenlerin nasıl davranacağını özelleştirmek için ince ayarlardan davranışı tamamen geçersiz kılma veya genişletmeye kadar birkaç fırsat vardır.
Sınıf Düzeyi: respond_to
Burada, Yanıtlayıcının işlemesi gereken biçimleri belirtirsiniz. Biçimler, hangi eylemlere uygulanacaklarına göre özelleştirilebilir. Her format, her format için eylemlerin tam olarak özelleştirilmesine olanak tanıyan ayrı çağrılarla belirtilebilir.
# Responds to html and json on all actions
respond_to :html, :json
# Responds to html and json on index and show actions only.
respond_to :html, :json, :only => [:index,:show]
# Responds to html for everything except show, and json only for index, create and update
respond_to :html, :except => [:show]
respond_to :json, :only => [:index, :create, :update]
Sınıf Düzeyi: responder
Bu, yanıtlayanı tutan bir sınıf özniteliğidir. Bu, çağrıya yanıt veren herhangi bir şey olabilir, yani bir proc / lambda veya çağrıya yanıt veren bir sınıf kullanabilirsiniz. Diğer bir alternatif, mevcut yöntemleri aşırı yüklemek için bir veya modülleri mevcut yanıtlayıcıya karıştırarak varsayılan davranışı arttırmaktır.
class SomeController < ApplicationController
respond_to :json
self.responder = proc do |controller, resources, options|
resource = resources.last
request = controller.request
if request.get?
controller.render json: resource
elsif request.post? or request.put?
if resource.errors.any?
render json: {:status => 'failed', :errors => resource.errors}
else
render json: {:status => 'created', :object => resource}
end
end
end
end
Bazı ilginç uç kullanım durumları olsa da, modülleri varsayılan yanıtlayıcıya genişletmek veya karıştırmak daha yaygın modeller olacaktır. Her durumda, ilgili seçenekler, yanıt_with'den iletildiği için kaynaklar ve seçeneklerdir.
Örnek Düzeyi: respond_with
Buradaki seçenekler, denetleyicinize render veya redirect_to'ya iletilecek olanlardır, ancak bunlar yalnızca başarı senaryoları için dahil edilmiştir. GET eylemleri için bunlar işleme çağrıları, diğer eylemler için bu yeniden yönlendirme seçenekleri olacaktır. Muhtemelen bunlardan en kullanışlı olanı :location
, yanıt_with argümanlarının doğru URL'yi oluşturmak için yeterli olmaması durumunda bu yönlendirme yolunu geçersiz kılmak için kullanılabilen seçenektir.
# These two are essentially equal
respond_with(:admin, @user, @post)
respond_with(@post, :location => admin_user_post(@user, @post)
# Respond with a 201 instead of a 200 HTTP status code, and also
# redirect to the collection path instead of the resource path
respond_with(@post, :status => :created, :location => posts_path)
# Note that if you want to pass a URL with a query string
# then the location option would be needed.
# /users?scope=active
respond_with(@user, :location => users_path(:scope => 'active'))
Bir alternatif olarak, yanıt verenler mücevher sadece bazı varsayılan davranışları geçersiz kılmak için bazı modüller sağlamakla kalmaz. Varsayılan yanıtlayıcıyı, varsayılan yanıtlayıcıyı genişleten anonim bir sınıfla geçersiz kılar ve özel modülleri bu sınıfa karıştırmak için sınıf düzeyinde bir yöntem sağlar. Burada en kullanışlı olanı, varsayılan olarak I18n sistemine özelleştirme yetkisi veren, varsayılan bir flaş seti sağlayan flaş yanıtlayıcıdır config/locales/en.yml
.
Önceki projelerde kullandığım bazı özel yanıtlayıcı örnekleri arasında kaynaklarımı otomatik olarak dekore eden ve sayfa başlığını kolayca özelleştirmek veya geçersiz kılmak için bir arayüzle varsayılan bir sayfa başlığı seti sağlayan bir yanıtlayıcı yer alıyor.
self.responder =
responder =