2014-11-05 48 views
0

铁轨4.2的,我不能做到以下几点:Rails的命名相同的路线,但与参数会引发错误

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

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

想法?

+0

为什么不将“slug”参数定义为可选项,然后您可以将两者合并?当然,在控制器中有一些逻辑。我认为你提到的错误有一个理由,显然这两个行为是针对不同的事情的,为什么他们必须有相同的名字? – 2014-11-05 18:23:19

回答

2

在导轨,用于不同的路线助手的名字应该是不同的。因此,正如你理解的那样,如果你为两条不同的路线使用相同的助手名字(例如你的案例中的'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文件中使用这个助手的方法(因为路由是按顺序读取的)。

希望这会有所帮助:)

+0

我结束了使用不同的命名路线。 – 2014-11-05 21:56:46

0

对于你指定的两条路线as: 'profile'这就是你的问题。除此之外,使用多元化的路线名字#index行动,e.g:

get 'profiles', to: 'profile#index' 
相关问题