2012-07-16 95 views
0

这似乎应该很容易做到,但我不知道如何徒手。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。

回答

1

这应该工作:

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 
+0

这很有趣。因此,为了在应用程序中生成路径,我需要指定:law参数。然后,正则表达式确保只有有效的meta_names可以接受另一个方向? – Dogweather 2012-07-16 08:31:02

+0

@Dogweather,是的。我也更新了一个更简单的方法来生成网址的答案。 – zsquare 2012-07-16 08:42:19

+0

这是一个很好的窍门 - 为内置路径生成器使用专用名称。你很关心SEO /重复数据问题。我通常还在这些复杂的网站中包含规范元标记。 – Dogweather 2012-07-16 08:51:16