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

时间:2016-01-31 01:06:13

标签: ruby-on-rails ruby-on-rails-4 instance-variables

什么会导致我的实例变量@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)

3 个答案:

答案 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 更清晰。

enter image description here

Very good write-up

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

让我知道,它是如何运作的......