从Rails 4.2开始,我无法执行以下操作:
get 'profile', to: 'profile#index', as: 'profile'
get 'profile/:slug', to: 'profile#show', as: 'profile'
因为它会引发错误,说路线已经定义。这是为什么?显然profile_path
和profile_path(User.last.slug)
是不一样的,即使它们碰巧共享相同的基本名称,也应该没有区别这两者的难度(你检查是否传递了一个参数)。
思想?
答案 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'