Rails: respond_with 自定义对象

Rails: respond_with custom object

respond_with 实际上是为了与 ActiveModel 的实例一起使用。我试图将它与 OpenStruct 的实例一起使用,但它引发了错误。 是否可以将 respond_with 与自定义对象一起使用?

class CryptController < ApplicationController
  respond_to :json

  def my_action
    respond_with OpenStruct.new(foo: 'foo', bar: 'bar')
  end
  # ...
end

引发:**未定义的方法persisted?' for nil:NilClass** ruby-2.1.4@rails4/gems/actionpack-4.2.5.1/lib/action_dispatch/routing/polymorphic_routes.rb:298:inhandle_list' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/actionpack-4.2.5.1/lib/action_dispatch/routing/polymorphic_routes.rb:206:in polymorphic_method' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/actionpack-4.2.5.1/lib/action_dispatch/routing/polymorphic_routes.rb:114:inpolymorphic_url'

respond_with 是一种辅助方法,可将资源公开给 MIME 请求。

来自documentation

 respond_with(@user)

对于 create 操作,等同于(假设示例中的 respond_to :xml):

respond_to do |format|
    if @user.save
      format.html { redirect_to(@user) }
      format.xml { render xml: @user, status: :created, location: @user }
    else
      format.html { render action: "new" }
      format.xml { render xml: @user.errors, status: :unprocessable_entity }
    end
  end
end

精确的等效值取决于控制器的动作。

关键要点是 respond_with 将 @instance 变量作为参数并首先尝试重定向到相应的 html 视图。如果失败,它会呈现 xml 响应,在上述情况下。

您正在传递一个结构,它与您的模型实例不对应。在这种情况下,respond_with 不知道在您的视图中重定向到哪里,也没有从中呈现 MIME 响应的实例。

请参阅 José Valim 的 RailsCast and this blogpost

注意:错误 undefined method persisted? 是由 Devise 生成的,可能是因为它找不到路由。