【问题标题】:Rails 4 Routes Params OptionallyRails 4 路由参数可选
【发布时间】:2014-02-20 12:23:15
【问题描述】:

这样的路线怎么做?

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

标识符总是_something

逗号可以输入多个项目。



编辑 01

我需要路由理解 Value_something。 然后像这样返回:

param[:_something] = Values

例如:01 - 一个属性

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

例如:02 - 两个属性

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

例如:03 - 没有顺序的两个属性

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

例如: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

【问题讨论】:

  • 无法理解您的问题。你想做什么?
  • 我想知道您是否可以利用现有的电子商务平台,如Spree,而不是从头开始编写这些东西。我不认为这是您将遇到的第一个电子商务特定挑战,而且我认为这些问题中的大多数可能已经被其他人解决了。
  • @JasonSwett 我不会创建电子商务系统,这只是一个例子。如果是,肯定会使用现成的服务。谢谢。
  • 我不认为路由解析器可以做这样的巧妙处理,即拆分组件,使用拆分的第一部分作为参数名,最后一部分作为值.您需要在控制器中执行此操作,尽管您可以有一个前置过滤器来执行此操作,如果这将在许多不同的操作中完成。
  • 查看我的答案的编辑,将路径片段转换为参数。

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


【解决方案1】:

为每种不同的情况制定自定义路线。例如

#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])

也就是说,我认为这是一个非常可怕的 url 架构。我认为将所有不同的选项作为参数而不是路径本身的一部分会更好,例如具有类似的网址

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

【讨论】:

  • 我愿意接受建议。可以举例说明这种格式吗?
猜你喜欢
  • 2014-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多