我已设法在索引页面上生成一系列三个按钮,使用户能够识别数据库中对象的子集 - 按钮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中),使得所有页面都可以访问它,而不需要再从头开始?
答案 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
那应该做的。