【问题标题】:Rails 3 routes: How to avoid conflict with 'show' action?Rails 3 路线:如何避免与“显示”动作发生冲突?
【发布时间】:2011-06-26 07:50:38
【问题描述】:

我目前为photos设置了以下路由:

resources :photos
match 'photos/:user' => 'photos#user', :as => :user_photo
match 'photos/:user/:key' => 'photos#show', :as => :show_photo

这两个 match 路由给了我这样的 URL:

http://example.com/photos/joe_schmoe
http://example.com/photos/joe_schmoe/123xyz

...类似于 Flickr 格式化其 URL 的方式。

不过,我遇到的问题是 photos/:user 路由被解释为 show 方法,或者如果我将这些自定义路由放在 resources 之前,那么像 /new 这样的路由会被解释为user 方法。

我怎样才能在不做大量自定义路线的情况下解决这个问题?

【问题讨论】:

    标签: ruby-on-rails-3 url routes


    【解决方案1】:

    在同一资源上混合使用 restful 路由和自定义匹配路由不是一个好主意。正如您所观察到的,这两条路线将拦截彼此的动作。您最好的选择是只为资源选择一个路由系统并坚持使用它。如果你想要 flickr 风格的路由,你应该删除 restful 路由并为你可能需要的 new/create/etc 添加其他必要的匹配路由。如果您非常想保留这两条路线,您要么需要在其余路线位于顶部的情况下禁用其余路线的显示,要么在匹配位于顶部的情况下从匹配路线中禁用新的。您可以使用正则表达式从匹配中过滤掉一些请求,如下所示:

    match 'photos/:user' => 'photos#user', :as => :user_photo, :constraints => { :user => /.*[^n][^e][^w].*/ }
    

    这真的很快就变得丑陋了,我建议根本不要使用休息路线。

    【讨论】:

      【解决方案2】:

      您需要将此自定义路由放在上方resources :users,以便在路由中首先匹配它。

      match 'photos/:user' => 'photos#user', :as => :user_photo
      resources :photos
      

      此外,您还可以完全禁用 show 操作:

      resources :photos, :except => :show
      

      【讨论】:

      • 很好,:except 正是我想要的。
      猜你喜欢
      • 1970-01-01
      • 2018-02-03
      • 2013-09-15
      • 1970-01-01
      • 1970-01-01
      • 2017-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多