Rails路由,使用匹配等效的资源是什么?

时间:2011-11-02 22:40:19

标签: ruby-on-rails ruby routes rake

我对routes.rb的行为有疑问。以下代码完美地运行,但这意味着GET /noodlesGET /都将返回面条索引。由于noodles_path将使用/noodles,因此网址会变得不必要地长,因此会不断弹出。

root :to => 'noodles#index'
match '/new' => 'noodles#new', :as => :new_noodle, :via => [:get]
resources :noodles, :only => [:index, :create, :show]

尝试删除GET /noodles,我试过了:

root :to => 'noodles#index'
match '/new' => 'noodles#new', :as => :new_noodle, :via => [:get]
resources :noodles, :only => [:create, :show]
match '/' => 'noodles#index', :as => :noodles, :via => [:get]

这似乎有效,但以某种方式中断了:create方法,因为它们都有noodles路径,即使我将其指定给:get,也只会让它感到困惑({{1}看起来不同,rake routes被提及两次,而在使用noodles时,它只被提及一次)。因此,通过这些新路线,不可能制作出新的面条。

删除resources (...)索引并将其设置为GET /noodles而不破坏GET /的正确方法是什么?

2 个答案:

答案 0 :(得分:1)

实际上,如果你真的不需要,最好不要将非资源丰富的路由与资源丰富的路由混合起来。在这种情况下,你没有。

root :to => 'noodles#index'
resources :noodles

这是你想要的,你会有'/'和'/ noodles'路径引导你到面条#index,这就是你想要的。

看看你的rake路线,你正在创造一些丑陋的东西;)如果你决定从像resources :noodles, :except => :index这样的面条资源中改变索引路线,你也摆脱了noodles_path和noodles_url方法。根本就是你可以随时改变主意。也许它会是sign_up页面,也许是不同的东西,也许它不会改变,但你不想放松那种自由。

答案 1 :(得分:0)

假设最佳解决方案是在尝试访问索引并使用这些路径时使用root_url而不是noodles_url

root :to => 'noodles#index'
resources :noodles, :except => :index

所以基本上这只会创建除:index之外的所有路由,因为此路由已经存在为root。然后在视图中使用root_url