2014-12-03 39 views
1

我有这样的代码链接到一个新的角色:Rails的routes.rb中不工作根据需要与命名路由

<%= link_to "New Persona", genesis_path, class: "new-persona-button" %> 

我的routes.rb文件:

Bazleyapp::Application.routes.draw do 

    resources :users, only: [:index, :create] 
    resources :personas, only: [:index, :create] 

    root      'static_pages#home' 

    get  'signup',     to: 'users#new' 
    get  '/:callsign',    to: 'users#show',  as: :user 
    get  '/:callsign/settings', to: 'users#edit',  as: :edit_user 
    patch '/:callsign',    to: 'users#update', as: :update_user 
    delete '/:callsign/terminated', to: 'users#destroy', as: :destroy_user 

    get  'genesis',    to: 'personas#new' 
    get  '/:callsign',    to: 'personas#show',  as: :persona 
    get  '/:callsign/settings', to: 'personas#edit',  as: :edit_persona 
    patch '/:callsign',    to: 'personas#update', as: :update_persona 
    delete '/:callsign/terminated', to: 'personas#destroy', as: :destroy_persona 

end 

点击新角色按钮产生此错误:

Started GET "/genesis" for ::1 at 2014-12-03 00:25:38 +0000 
Processing by UsersController#show as HTML 
Parameters: {"callsign"=>"genesis"} 
User Load (0.4ms) SELECT "users".* FROM "users" WHERE "users"."callsign" = $1 LIMIT 1 [["callsign", "bazzer"]] 
User Load (0.3ms) SELECT "users".* FROM "users" WHERE "users"."callsign" = $1 LIMIT 1 [["callsign", "genesis"]] 
Completed 500 Internal Server Error in 21ms 

NoMethodError (undefined method `activated' for nil:NilClass): 
app/controllers/users_controller.rb:17:in `show' 

这意味着当它应该击中genesis_p时它正在触及user_path(users#show) ATH。但我已经告诉它<%= link_to "New Persona", genesis_path, class: "new-persona-button" %>打的起源路径。我很困惑。错误在哪里?

回答

1

get 'genesis', to: 'personas#new' 

get '/:callsign', to: 'users#show', as: :user 

你必须知道的路由文件是从上往下看之前。

+0

但是,为什么不使用'genesis_path'告诉它直来直去的角色/新的动作? – Bazley 2014-12-03 17:16:54

1

我不认为你这里有什么事,你要覆盖几路工作。您可能需要考虑将它们放在单独的名称空间中,以便它们是唯一的。

例子:

Bazleyapp::Application.routes.draw do 

    resources :users, only: [:index, :create] 
    resources :personas, only: [:index, :create] 

    root      'static_pages#home' 

    namespace :users do 
    get  'signup',     to: 'users#new' 
    get  '/:callsign',    to: 'users#show',  as: :user 
    get  '/:callsign/settings', to: 'users#edit',  as: :edit_user 
    patch '/:callsign',    to: 'users#update', as: :update_user 
    delete '/:callsign/terminated', to: 'users#destroy', as: :destroy_user 
    end 

    namespace :personas do 
    get  'genesis',    to: 'personas#new' 
    get  '/:callsign',    to: 'personas#show',  as: :persona 
    get  '/:callsign/settings', to: 'personas#edit',  as: :edit_persona 
    patch '/:callsign',    to: 'personas#update', as: :update_persona 
    delete '/:callsign/terminated', to: 'personas#destroy', as: :destroy_persona 
    end 
end 

这样,这些路由你不同的路径。

您还可以将块添加到资源,而不必把它分开。例如:

resources :users, only: [:index, :create] do 
    get  'signup',     to: 'users#new' 
    get  '/:callsign',    to: 'users#show',  as: :user 
    get  '/:callsign/settings', to: 'users#edit',  as: :edit_user 
    patch '/:callsign',    to: 'users#update', as: :update_user 
    delete '/:callsign/terminated', to: 'users#destroy', as: :destroy_user 
end 
+0

谢谢。但是,我的原始代码应该可以工作,这不应该是必要的?我使用了命名路线。当然告诉轨使用genesis_path它应该跳过user_path? – Bazley 2014-12-03 16:51:43

+0

我认为命名路线的整个想法是,你可以给他们个人名字,并确保一条路线不与另一个混淆?! – Bazley 2014-12-03 17:02:04

+0

'得到“genesis''创建命名的路线'genesis_path'不是吗? – Bazley 2014-12-03 17:27:23