将链式示波器作为第3栏上的参数传递?

时间:2011-03-28 12:15:25

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

我认为这是:

<%= link_to "shirts", things_path (:scope => "shirts" ) %>

这在我的控制器上

@products = Product.send(params[:scope])

但是我想使用链式范围,例如:

<%= link_to "shirts", products_path (:scope => "shirts.blue" )  %>

但由于某些原因无效。

可能我的语法错了?

2 个答案:

答案 0 :(得分:7)

如果您要使用params作为send方法的参数,请不要忘记通过范围的白名单进行检查:

safe_scopes = %w(shirts pants boots blue red yellow)

然后你可以使用fl00r的zlution:

@products = Product.scoped
params[:scope].split(".").each{|scope| @products = @products.send(scope) if safe_scopes.include?(scope)}

因为有人会尝试将?scope=shirts.destroy_all发送给您的控制器或其他人。

答案 1 :(得分:3)

试试这个

<%= link_to "shirts", products_path (:scope => "shirts.blue" ) %>

模型

@products = Product.scoped
params[:scope].split(".").each{|scope| @products = @products.send(scope)}