【问题标题】: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 中的路线越少越好。所以只定义你想要的,而不是更多。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多