2014-12-03 3 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' 

что означает, что ударять user_path (пользователи # шоу), когда он должен поражать genesis_p 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

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

+0

Я думал, что вся идея названных маршрутов была так, чтобы вы могли дать им индивидуальные имена и убедиться, что один маршрут не смутился с другим ?! – Bazley

+0

'get 'genesis'' создает именованный маршрут' genesis_path', не так ли? – Bazley

Смежные вопросы