Rails 4 Routes Params可选

时间:2014-02-20 12:23:15

标签: ruby-on-rails ruby ruby-on-rails-4 routes rails-routing

这样的路线如何?

www.site.com/clothing/men/T-Shirts_type/Nike_brand/100-500_price/Red,White,Blue_color/
www.site.com/clothing/woman/Nike_brand/100-500_price/Red,White,Blue_color/

应始终按顺序排列:

www.site.com/Sex/Type/Brand/Price/Color

即使没有插入所有可用选项:

www.site.com/Type/Color

idenficador总是_something

逗号可输入多个项目。



编辑01

我需要路线了解Value_something。 然后回归:

param[:_something] = Values

例如:01 - 一个属性

URL: site.com/clothing/men/T-Shirts_type
param[:_type] = T-Shirts

Ex:02 - 两个属性

URL: site.com/clothing/men/T-Shirts_type/Nike_brand
param[:_type] = T-Shirts
param[:_brand] = Nike

Ex:03 - 两个没有订单的属性

URL: site.com/clothing/men/Nike_brand/T-Shirts_type
param[:_brand] = Nike
param[:_type] = T-Shirts

Ex:04 - 属性中的多个参数

URL: site.com/clothing/men/Red,White,Blue_color
param[:_color] = Red,White,Blue

例如:05 - 所有带订单的属性

URL: site.com/clothing/men/T-Shirts_type/Nike_brand/100-500_price/Red,White_color
param[:_type] = T-Shirts
param[:_brand] = Nike
param[:_price] = 100-500
param[:_color] = Red,White

例如:05 - 没有订单的所有属性

URL: site.com/clothing/men/Red,White_color/T-Shirts_type/100-500_price/Nike_brand
param[:_color] = Red,White
param[:_type] = T-Shirts
param[:_price] = 100-500
param[:_brand] = Nike

1 个答案:

答案 0 :(得分:0)

为每个不同的案例制作自定义路线。例如

#in config/routes.rb
get '/clothing/:sex/:option1/:option2/:option3/:option4/:option5', to: 'product#index'
get '/clothing/:sex/:option1/:option2/:option3/:option4', to: 'product#index'
get '/clothing/:sex/:option1/:option2/:option3', to: 'product#index'
get '/clothing/:sex/:option1/:option2', to: 'product#index'
get '/clothing/:sex/:option1', to: 'product#index'

然后在您的索引操作中,您将要执行类似

的操作
options = [params[:option1], params[:option2], params[:option3], params[:option4], params[:option5]].reject(&:blank?)
condition_strings = ["sex = #{params[:sex]}"]
options.each do |option_string|
  choices, category = option_string.split(" ")
  condition_strings << "#{category} in (#{choices})"
end
conditions = condition_strings.map{|string| "(#{string})"}.join(" AND ")
@products = Product.find(:all, :conditions => [conditions])

那就是说,我认为这是一个非常糟糕的网址架构。我认为将所有不同的选项作为参数而不是路径本身的一部分会更好,例如有像

这样的网址

www.site.com/clothing?gender=men&type=T-Shirts&brand=Nike&price=100-500&color=Red,White,Blue

这是一种更常规的做事方式。

编辑 - 重写上述控制器端处理,以创建所需的参数结构:

options = [params[:option1], params[:option2], params[:option3], params[:option4], params[:option5]].reject(&:blank?)
options.each do |option_string|
  choices, category = option_string.split("_")
  params[category] = choices
end