【问题标题】:Rails 3 routes - how can I automatically map each action (with exceptions)?Rails 3 路线 - 我如何自动映射每个动作(有例外)?
【发布时间】:2010-10-05 01:58:19
【问题描述】:
我是 Rails 3 路由的相对初学者,现在它给我带来了足够的痛苦,我想找出真正的解决方案。
几个细节:
我有一些半静态控制器,其中包含标准七种之外的一些方法 new、create、edit、update、destroy 等。
一般来说,我希望我的路线页面将所有内容映射到“控制器/操作”,但可能有极少数例外。
我的印象是,出于安全原因,不建议使用像 match ':controller/:action' 这样的通用映射,尽管我更喜欢使用会话数据而不是更容易修改的参数。
以有效的方式构建我的路线文档的最佳方法是什么?
【问题讨论】:
标签:
ruby-on-rails
routing
ruby-on-rails-3
【解决方案1】:
你可以在 routes.rb 中使用这个匹配:
match ':controller(/:action(/:id(.:format)))'
或者它的一些变体,比如get,而不是match,等等。
由于路由是从从上到下解析的,因此您可以使用您的例外(和标准资源路由)高于通用路由规则。
至于安全问题 - 如果您的路由表中有此通用规则,那么您应该使用 private 关键字保护控制器中的所有非操作方法。
通用规则还有另一个问题。比较这条规则:
get "foo/show/:id", :to => "foo#show"
与通用的。这个显式规则的好处是它从未调用过/foo/show(没有 id 部分),因此当您的操作方法中没有 params[:id] 时,您将不会遇到这种情况。
关于您的问题的最后一条评论:使用会话来保持导航状态通常不是一件好事。这取决于您的配置,但会话可以在两个浏览器选项卡之间共享 - 然后导航会变得非常混乱。不要忘记可怕的后退按钮。
所以我认为你真的不应该使用通用路由。
【解决方案2】:
您只需要定义所有路线。只有你真正需要的。使用资源通过 :only 或 :except 选项为您生成一些自动路线,以避免无用的路线。
您的 route.rb 中的路线越少越好。所以只定义你想要的,而不是更多。