什么会导致我的实例变量@product没有为重定向设置/传递。 Product是ActiveModel对象,而不是ActiveRecord。更具体地说,@ product变量没有出现在redirect_to(new_services_path)或redirect_to(home_path)页面中。由于@product变量需要在我的页脚中填充每页上的表单。
Application_controller:
class ApplicationController < ActionController::Base
before_filter :set_product
private
def set_product
@product ||= Product.new
end
end
Product_controller:
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
与此原始帖子相关的问题.. Passing variables through multiple partials (rails 4)
答案 0 :(得分:3)
实例变量不会在重定向上传递。
因此,当您到达@product
时,您没有before_filter
个对象,因此您每次只创建新的Product
对象。
ActiveModel对象无法在会话之间保持不变,但您可以将属性保留在会话存储中并在before_filter中使用
def set_product
@product = Product.new(session[:product]) if session[:product]
@product ||= Product.new
end
在你的创建方法中,你将表格参数移动到会话......
def create
session[:product] = params[:product]
set_product
if @product.category == 'wheels'
---
请注意,我们在create方法中明确调用了set_product
,因为会话[:product]已经重新建立。
如果您想知道为什么实例变量丢失...在create方法中,您位于ProductController的实例中,并且该实例具有自己的实例变量。当您重定向时,您正在指示rails创建一个其他(或相同)控制器的新实例,以及该全新控制器对象,它没有建立实例变量。
答案 1 :(得分:2)
要添加到SteveTurczyn
的答案,您需要阅读object orientated programming。在我这样做之后,所有@instance
变量的内容都变成了 lot 更清晰。
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
-
因此,当你问......
@product
变量需要在我的页脚中填充每页上的表单。
您需要记住,每次时间都会调用您的动作。你已经这样做了;问题是你没有持久化数据:
#app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
before_filter :set_product
private
def set_product
@product ||= Product.new #-> after "create", params[:product] = nil (new instance)
end
end
当他提到将数据放入会话时, @SteveTurczyn
得到了它。根据{{3}} ...
HTTP是docs。会话使其成为有条不紊的。
答案 2 :(得分:0)
Steve提到的解决方案适用于少量数据,但是如何获取一些记录并使用redirect_to传递它。会议不允许我们这么多空间。
我所做的是我将这些记录设置在flash对象中,当它重定向到页面时,flash为我成功渲染了数据。
flash[:products] = @products
redirect_to users_path
让我知道,它是如何运作的......