Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.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 未使用重定向设置实例变量_Ruby On Rails_Ruby On Rails 4_Instance Variables - Fatal编程技术网

Ruby on rails 未使用重定向设置实例变量

Ruby on rails 未使用重定向设置实例变量,ruby-on-rails,ruby-on-rails-4,instance-variables,Ruby On Rails,Ruby On Rails 4,Instance Variables,什么会导致我的实例变量@product无法为重定向设置/传递。产品是ActiveModel对象,而不是ActiveRecord。更具体地说,@product变量没有出现在重定向到(新服务路径)或重定向到(主页路径)页面中。因为@product变量需要在每个页面的页脚中填充一个表单 应用程序控制器: class ApplicationController < ActionController::Base before_filter :set_product private

什么会导致我的实例变量@product无法为重定向设置/传递。产品是ActiveModel对象,而不是ActiveRecord。更具体地说,@product变量没有出现在重定向到(新服务路径)或重定向到(主页路径)页面中。因为@product变量需要在每个页面的页脚中填充一个表单

应用程序控制器:

class ApplicationController < ActionController::Base 
  before_filter :set_product

  private

  def set_product
    @product ||= Product.new
  end
end
  def new
  end


 def create
    @product = Product.new(params[:product])

    if  @product.category == "wheels"
      redirect_to(new_services_path) 
    else
      redirect_to(home_path) 
    end
  end
与此原始帖子相关的问题。。
实例变量不会在重定向时传递

因此,在到达过滤器之前的
时,没有
@product
对象,因此每次只创建新的空
product
对象

ActiveModel对象不能在会话之间持久化,但您可以将属性保留在会话存储中,并在before_筛选器中使用

def set_product
  @product = Product.new(session[:product]) if session[:product]
  @product ||= Product.new
end
在create方法中,将表单参数移动到会话中

def create
  session[:product] = params[:product]
  set_product 
  if @product.category == 'wheels'
  ---
注意,我们在create方法中显式地调用了
set_product
,因为会话[:product]已经重新建立


如果您想知道为什么实例变量丢失了。。。在create方法中,您位于ProductController的一个实例中,该实例具有自己的实例变量。重定向时,您指示rails创建其他(或相同)控制器的新实例,而该全新控制器对象没有建立实例变量。

要添加到
SteveTurczyn
的答案中,您需要详细阅读。在我这样做之后,所有的
@instance
变量内容变得更加清晰


Ruby是面向对象的,这意味着每次发送请求时,它都必须调用所有相关对象(类),以便与您进行交互:

此请求的持续时间称为实例。重定向调用一个新的请求;因此,您的各种类都有了一个新的实例

这就是为什么每次用户与新操作交互时都必须调用新的
@instance
变量的原因:

#app/controllers/your_controller.rb
class YourController < ApplicationController
   def edit
      @model = Model.find params[:id]
   end

   def update
      @model = Model.find params[:id] #-> new request = new instance
   end
end
@SteveTurczyn
当他提到将数据放入会话时明白了这一点。根据

HTTP是一种协议。会话使它有状态


Steve提到的解决方案将适用于较小的数据量,但如何获取一些记录并将其与重定向_一起传递给呢。会议没有给我们那么多的空间

我所做的是在flash对象中设置这些记录,当它重定向到页面时,flash成功地为我呈现了数据

flash[:products] = @products
redirect_to users_path

让我知道它是如何工作的…

@Product。。。也许是@product?这是stackoverflow上的错误输入。修正了。我不太明白你想要什么,但它可以解决你的问题变量仍然没有被传递redirect@henb,我正试图重定向到另一个控制器,但传递了
@product
变量,以便它在页脚中填充我的表单。回答得很好,谢谢。我需要担心会破坏会话吗?
flash[:products] = @products
redirect_to users_path