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