Ruby on rails Rail 3:重定向后实例变量不可用
我在Rails 3中有一个表单向导。基本上,我创建一个酒店对象,然后当所有这些都完成后,我想为该酒店创建一个位置对象。用于创建酒店的控制器代码如下所示:Ruby on rails Rail 3:重定向后实例变量不可用,ruby-on-rails,redirect,Ruby On Rails,Redirect,我在Rails 3中有一个表单向导。基本上,我创建一个酒店对象,然后当所有这些都完成后,我想为该酒店创建一个位置对象。用于创建酒店的控制器代码如下所示: def create @hotel = Hotel.new(params[:hotel]) respond_to do |format| if @hotel.save @location = Location.new format.html { redirect_to '/set
def create
@hotel = Hotel.new(params[:hotel])
respond_to do |format|
if @hotel.save
@location = Location.new
format.html { redirect_to '/set_location'}
else
format.html { render action: "new" }
end
end
end
然后在“/set_location”页面中,我有一个设置位置的表单。但是,@location实例变量的html.erb上出现了一个“NilClass:Class的未定义方法模型\u名称”
错误
这真的很奇怪,因为当我使用render'/set_location'而不是重定向_到时,它可以正常工作。但是,我想使用redirect_to方法来防止重复的记录提交
提前感谢您在这方面提供的帮助。HTTP在设计上是无状态的。如果要在请求之间共享状态(重定向导致另一个请求),应使用
会话
散列。像这样:
session[:hotel_id] = @hotel.id
然后在/set\u位置
中检索您的酒店
,方法如下:
Hotel.find(session[:hotel_id])
我相信你想做的是:
@location=location.new
。你需要在那里创建它但是,您正在执行重定向,因此您正在呼叫另一个控制器,该控制器不知道
@location
是什么。我相信Nobita在这里的回答是最全面的,并且回答了OP确切的问题。请投赞成票(@Ger)
在jdoe的回答中,我预期或希望看到更多关于他/她(jdoe)在解释中使用“request”的解释,因为“request”可以被解释为对其他框架中的视图(或模板)的请求,所以这句话可能对新的Rails开发人员(包括我自己)有点误导在阅读Rails时:
“变量不能在请求之间传递。我认为作者得到了
想法:使用会话。”
在某种意义上,当您使用“render”从控制器请求视图/模板时,确实可以传递变量。因此,如果您的控制器方法呈现一个视图,该视图将知道您在该控制器中定义的@变量
此外,使用会话实际上不是在请求之间传递变量的唯一方法。您可以修改重定向到路由以捕获变量:
考虑(在routes.rb文件中):
现在,在“调查”控制器“结果”操作方法中,您将有一个:id
参数。您可以将其称为params[:id]
,例如,在数据库中查找具有此id的对象。我相信,还有一种方法可以从URI/URL隐藏:id
,以防您不希望用户在那里看到它
@shime:关于你的“重复输入”问题,我相信OP指的是根据POST请求提供视图。想象一下,如果发布成功,那么在提交表单后,每次刷新页面时,您都可能会向数据库提交一个重复条目(re-direct方法会确保不会发生这种情况,因此是从POST请求路由的标准方式)我发现这一段对两种实现都有最清晰的解释:
什么是重复错误提交?redirect_将您重定向到另一个控制器操作,如果您没有在那里设置实例变量,它将失败。这是一个重复的记录提交-基本上是数据库中的重复数据。这是否意味着我在一个控制器操作中拥有的实例变量在我点击另一个时丢失了?有没有办法在这些操作之间传递变量?也许把它放在会议上?坏习惯不?那没用。无法在请求之间传递变量。我认为作者的想法是:使用会话。
match 'surveys/result(/:id)' => "surveys#result", via: [:get], as: 'surveys_result'