2012-07-16 96 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