這應該工作:
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