1

我有一个名为的模型Entity,控制器中的创建操作如下所示:

# enitities_controller.rb
def create
   # loading params, etc...
   @entity.save
   respond_with @entity
end

我将 jbuilder 用于自定义 JSON 视图而不是渲染@entity.to_json,效果很好。我有最后一个问题,即当模型由于验证错误而无法保存时,我得到以下响应(带有 status 422 Unprocessable Entity):

{"errors":{"parent_share":["can't be blank","is not a number"]}}

我想用我自己的覆盖这个json。我知道他有可能替换respond_with @entity为:

respond_with @entity do |format|
  if @entity.errors.any?
    format.json {
      render "entities/create", :status => :unprocessable_entity
    }
  end
end

但是不应该通过定义某种错误视图或其他东西来获得更自动的魔术方式吗?这感觉有点脏,这让我每次需要它时都必须编写更多代码,而不是让我使用respond_with. 还有其他方法吗?

4

1 回答 1

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 响应者的行为。

于 2013-11-25T21:40:06.100 回答