Rails动态子路径?
问题描述:
这似乎应该很容易做到,但我不知道如何徒手。Rails动态子路径?
我有国家和规约模式,目前使用这样的路径:通过这种途径
/california/statutes/robbery
/newyork/statutes/burglary
:
match '/:state_id/statutes/:id' => 'statutes#show', :as => :state_statute, :id => /[^\/]+/
但事实是,在美国加州,法规被称为代码 。而在纽约,他们是法律。
我的问题是,我怎么能自动支持这些更有意义的路径:
/california/codes/robbery
/newyork/laws/burglary
我存储在模型信息,可以使用; Statute.meta_name。
答
这应该工作:
match '/:state_id/:law/:id' => 'statutes#show', :as => :state_statute, :id => /[^\/]+/, :law => Regexp.new(Statute.meta_name.join("|"))
这样做的问题是,无论这些URL会的工作:
/california/laws/robbery
/newyork/laws/burglary
这通常是坏的搜索引擎优化。你可以修复,通过像过滤器之前添加:
before_filter :validate_law_title
def validate_law_title
unless <condition to check if the title used is correct, ie, codes for cali, laws for NY>
redirect_to <correctly generated url>, :status=>:moved_permanently
end
end
- 编辑 -
为了使路线的产生更容易,使用路线,如:
match '/:state_id/:law/:id' => 'statutes#show', :as => "_state_statute", :id => /[^\/]+/, :law => Regexp.new(Statute.meta_name.join("|"))
而且在application_controller ,或者最好是一个lib文件,你可以添加:
# law is the law/rule, etc object
def state_statute_path(law, options={})
options.merge!(:law => <figure out the label to use from the law object>)
_state_statute_path(options)
end
这很有趣。因此,为了在应用程序中生成路径,我需要指定:law参数。然后,正则表达式确保只有有效的meta_names可以接受另一个方向? – Dogweather 2012-07-16 08:31:02
@Dogweather,是的。我也更新了一个更简单的方法来生成网址的答案。 – zsquare 2012-07-16 08:42:19
这是一个很好的窍门 - 为内置路径生成器使用专用名称。你很关心SEO /重复数据问题。我通常还在这些复杂的网站中包含规范元标记。 – Dogweather 2012-07-16 08:51:16