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

use*_*677 5 ruby-on-rails instance-variables ruby-on-rails-4

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

应用控制器:

class ApplicationController < ActionController::Base 
  before_filter :set_product

  private

  def set_product
    @product ||= Product.new
  end
end
Run Code Online (Sandbox Code Playgroud)

产品_控制器:

  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
Run Code Online (Sandbox Code Playgroud)

与此原始帖子相关的问题.. 通过多个部分传递变量(rails 4)

Ste*_*zyn 5

实例变量不会在重定向时传递。

@product因此,当你到达时你没有对象before_filter,所以你Product每次只是创建新的空对象。

ActiveModel 对象无法在会话之间持续存在,但您可以将属性保留在会话存储中并在 before_filter 中使用它

def set_product
  @product = Product.new(session[:product]) if session[:product]
  @product ||= Product.new
end
Run Code Online (Sandbox Code Playgroud)

在您的创建方法中,您将表单参数移动到会话中......

def create
  session[:product] = params[:product]
  set_product 
  if @product.category == 'wheels'
  ---
Run Code Online (Sandbox Code Playgroud)

请注意,我们set_product在 create 方法中显式调用,因为 session[:product] 已重新建立。

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