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

elk*_*o23 3 ruby activerecord ruby-on-rails ruby-on-rails-3

我有这个观点:

<%= link_to "shirts", things_path (:scope => "shirts" ) %>
Run Code Online (Sandbox Code Playgroud)

这在我的控制器上

@products = Product.send(params[:scope])
Run Code Online (Sandbox Code Playgroud)

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

<%= link_to "shirts", products_path (:scope => "shirts.blue" )  %>
Run Code Online (Sandbox Code Playgroud)

但由于某些原因,它不起作用.

可能我的语法错了?

Bit*_*rse 7

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

safe_scopes = %w(shirts pants boots blue red yellow)
Run Code Online (Sandbox Code Playgroud)

然后你就可以选择了fl00r:

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

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

  • `(params [:scope] .split('.')&safe_scopes).each {| scope | @products = @ products.send(scope)}`更短的方式 (2认同)