如何记住控制器中页面之间的参数值

时间:2011-02-15 12:15:52

标签: ruby-on-rails class ruby-on-rails-3

我已设法在索引页面上生成一系列三个按钮,使用户能够识别数据库中对象的子集 - 按钮1 - 类型=“新”,按钮2 - 类型=“已使用”,按钮3 - 没有限制,即可以是新的或使用的。

目前index.html.erb包含:

<%= link_to "New", :controller => params[:controller], :action => params[:action],    :product_type => 'New' %>
<%= link_to "Used", :controller => params[:controller], :action => params[:action], :product_type => 'Used' %>
<%= link_to "Don't Restrict", :controller => params[:controller], :action => params[:action], :product_type => nil %>

在product.rb中我有:

scope :by_product_type, lambda{|product_type| where(:product_type => product_type) unless product_type.nil? }

最后我有productfinder_controller:

before_filter :load_grips, :only => [:index, :bybrand, :bycolour, :byprice]
protected
def load_products
if params[:product_type]
  @productssmatchingtype = Product.by_product_type(params[:product_type])
else
  @productsmatchingtype = Product
end
end

上面的代码完全符合我的预期,最初加载所有项目并在按下按钮1或按钮2时限制它们。

我还想在Productfindercontroller中的其他3个页面上使用类似的功能,即byprice,bybrand和bycolour。我已经在上面提供的其他3个.html.erb文件中添加了与上面提供的相同的代码,并且事情似乎也在表现......

EXCEPT - 当加载新页面时,默认是显示所有产品,即它没有记住用户在上一页上按下了什么按钮。是否可以存储控制器中所有页面都可以访问的按钮信息?类似地/或者,是否可以以这样的方式定义@productsmatchingtype(在productfinder_controller中),使得所有页面都可以访问它,而不需要再从头开始?

1 个答案:

答案 0 :(得分:7)

您无法记住变量beetwen请求。但是,您可以在会话中存储product_type:

def load_products
  #get product_type from session if it is blank
  params[:product_type] ||= session[:product_type]
  #save product_type to session for future requests
  session[:product_type] = params[:product_type]
  if params[:product_type]
    @productssmatchingtype = Product.by_product_type(params[:product_type])
  else
    @productsmatchingtype = Product
  end
end

那应该做的。