Rails与命名路由相同,但带参数会引发错误

时间:2014-11-05 18:13:05

标签: ruby-on-rails

从Rails 4.2开始,我无法执行以下操作:

  get 'profile', to: 'profile#index', as: 'profile'
  get 'profile/:slug', to: 'profile#show', as: 'profile'

因为它会引发错误,说路线已经定义。这是为什么?显然profile_pathprofile_path(User.last.slug)是不一样的,即使它们碰巧共享相同的基本名称,也应该没有区别这两者的难度(你检查是否传递了一个参数)。

思想?

2 个答案:

答案 0 :(得分:2)

在rails中,不同路由的帮助程序名称应该不同。因此,正如您正确理解的那样,如果您对两条不同的路线使用相同的帮助程序名称(例如:在您的情况下为“profile”),您将收到错误。

Rails中的这一限制有助于保持routes.rb文件以及应用程序的健全性。例如,考虑控制器的两种方法:

class XyzController < ApplicationController
  def method_a(param1)
  end

  def method_b(param1)
  end
end

在您的路线文件中,如果不存在保持帮助名称不同的限制,您可以使用:

get 'xyz/method_a', to: 'profile#method_a', as: 'profile_method'
get 'xyz/method_b', to: 'profile#method_b', as: 'profile_method'

相应地在您的视图文件中:

 link_to 'link_1', profile_method_path('param1')  #intended to route for method_a
 link_to 'link_2', profile_method_path('param2')  #intended to route for method_b 

很明显,在视图文件中,不仅难以确定哪个路径适用于哪个方法,它也不可能使用帮助器'profile_method'路由到任何其他控制器方法,除了第一个方法在routes.rb文件中使用此帮助程序(顺序读取路径)。

希望这会有所帮助:)

答案 1 :(得分:0)

对于您指定as: 'profile'的两条路线,这就是您的问题所在。除此之外,使用多个路由名称进行#index操作,例如:

get 'profiles', to: 'profile#index'