我有一个名为Entity
的模型,控制器中的创建操作如下所示:
# enitities_controller.rb
def create
# loading params, etc...
@entity.save
respond_with @entity
end
我使用jbuilder来自定义JSON视图而不是渲染@entity.to_json
,这非常有用。我有最后一个问题,即由于验证错误导致模型无法保存,我得到以下响应(状态为422 Unprocessable Entity
):
{"errors":{"parent_share":["can't be blank","is not a number"]}}
我想用自己的方式覆盖这个json。我知道他可以用{:1>替换respond_with @entity
respond_with @entity do |format|
if @entity.errors.any?
format.json {
render "entities/create", :status => :unprocessable_entity
}
end
end
但是,不应该通过定义某种错误视图或其他东西来实现更自动化的方法吗?这感觉有点脏,这使我每次需要时都要编写更多代码而不是允许我使用respond_with
。还有另一种方式吗?
答案 0 :(得分:1)
与此同时,我找到了答案:
您必须创建文件lib/application_responder.rb
并添加以下内容:
class ApplicationResponder < ActionController::Responder
include Responders::FlashResponder
include Responders::HttpCacheResponder
def to_json
set_flash_message! if set_flash_message?
if !has_errors? || response_overridden?
default_render
else
controller.default_render( status: :unprocessable_entity )
end
end
end
并将以下内容添加到您的应用程序响应程序:
self.responder = ApplicationResponder
这样做是添加一个to_json方法,该方法将复制to_js响应者的行为。