首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails动态子路径路由?

Rails动态子路径路由?
EN

Stack Overflow用户
提问于 2012-07-16 08:13:30
回答 1查看 709关注 0票数 0

这似乎很容易做,但我不知道如何草草。

我有“国家”和“规约”的模式,目前使用的途径如下:

代码语言:javascript
复制
/california/statutes/robbery
/newyork/statutes/burglary

使用这条路线:

代码语言:javascript
复制
match '/:state_id/statutes/:id' => 'statutes#show', :as => :state_statute, :id => /[^\/]+/

但问题是,在加州,法规被称为代码。在纽约,他们是法律。

我的问题是,我如何能够自动支持这些更有意义的路径:

代码语言:javascript
复制
/california/codes/robbery
/newyork/laws/burglary

我将这些信息存储在模型中,可以使用;Statute.meta_name。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-07-16 08:28:29

这应该是可行的:

代码语言:javascript
复制
match '/:state_id/:law/:id' => 'statutes#show', :as => :state_statute, :id => /[^\/]+/, :law => Regexp.new(Statute.meta_name.join("|"))

问题是,这两个urls都能工作:

代码语言:javascript
复制
/california/laws/robbery
/newyork/laws/burglary

这通常对SEO不利。您可以通过添加一个前置筛选器来解决这个问题,例如:

代码语言:javascript
复制
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

-编辑--

若要使生成路由更容易,请使用以下路由:

代码语言:javascript
复制
match '/:state_id/:law/:id' => 'statutes#show', :as => "_state_statute", :id => /[^\/]+/, :law => Regexp.new(Statute.meta_name.join("|"))

在application_controller中,或者最好是一个库文件中,可以添加:

代码语言:javascript
复制
# 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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11500401

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档