这看起来应该很容易,但我不确定如何随便。
我有State和Statute模型,目前使用这些路径:
/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。
答案 0 :(得分:1)
这应该有效:
match '/:state_id/:law/:id' => 'statutes#show', :as => :state_statute, :id => /[^\/]+/, :law => Regexp.new(Statute.meta_name.join("|"))
这个问题是这两个网址都有用:
/california/laws/robbery
/newyork/laws/burglary
这通常对SEO不利。你可以通过添加一个之前的过滤器来解决这个问题:
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