Rails:response_with自定义对象

时间:2016-04-02 17:23:18

标签: ruby-on-rails ruby responders

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:in handle_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:in polymorphic_url'

1 个答案:

答案 0 :(得分:0)

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响应。

您传入的是一个ostruct,它与您的模型实例不对应。在这种情况下,respond_with不知道在您的视图中重定向到哪里,也没有用于呈现mime响应的实例。

请参阅JoséValim的RailsCastthis blogpost

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