2

在 Rails 3.2.x 中使用 RABL,给定以下控制器操作:

respond_to :html, :json

def create
  @foo = Foo.create(params[:foo])
  respond_with @foo
end

假设验证失败,您如何让 respond_with 使用 RABL 模板而不是标准 JSON 错误散列 - IE。除了与请求一起发回的验证错误消息之外,我还想要其他模型属性。

建议?

4

2 回答 2

5

我很难找到这个。您应该为您的应用程序控制器创建一个自定义响应器,或者至少为您的个人响应创建一个自定义响应器。有关更多详细信息,请参阅喜欢 ActionController::Responder的三个理由。

我的解决方案:

# app/responders/api_responder.rb
class ApiResponder < ActionController::Responder
  def to_format
    case
    when has_errors?
      controller.response.status = :unprocessable_entity
    when post?
      controller.response.status = :created
    end

    default_render
  rescue ActionView::MissingTemplate => e
    api_behavior(e)
  end
end

# app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  #...
  self.responder = ApiResponder
  #...
end

你也可以respond_with @foo, responder: ApiResponder改用。

感谢haxney让我朝着正确的方向前进。

于 2012-05-14T21:03:11.447 回答
0

我想,您需要删除控制器顶部的 respond_to 调用,并删除 action 中的 respond_with 调用以获取 rabl 渲染您的 rabl 模板。

只需在不需要 RABL 的每个操作的末尾添加一个 respond_to 块。

于 2012-05-01T11:12:59.013 回答