Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rail 3:重定向后实例变量不可用_Ruby On Rails_Redirect - Fatal编程技术网

Ruby on rails Rail 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

我在Rails 3中有一个表单向导。基本上,我创建一个酒店对象,然后当所有这些都完成后,我想为该酒店创建一个位置对象。用于创建酒店的控制器代码如下所示:

  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
    。你需要在那里创建它
  • Rails中的实例变量通常用于在控制器和视图之间传递信息,这就是为什么在执行渲染时不会出现该错误的原因。Rails视图从控制器了解实例变量


    但是,您正在执行重定向,因此您正在呼叫另一个控制器,该控制器不知道
    @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'