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'
答案 0 :(得分:0)
respond_with
是一个帮助方法,它将资源公开给mime请求。
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的RailsCast和this blogpost。
注意:错误undefined method persisted?
是由Devise生成的,可能是因为找不到路由。