2014-11-04 2 views
1

Я пытаюсь выяснить, как указать маршрут, который я пытаюсь использовать, но я продолжаю получать ошибки маршрутизации. Может кто-нибудь, пожалуйста, укажите, где я ошибаюсь и, возможно, объясню, что может быть лучшим способом сделать это?Rails routing при вложенности ресурсов

Я работаю с этими (вложенными) ресурсами:

resources :users do 
    resources :playlists 
end 

Модель:

class User < ActiveRecord::Base 
    has_many :playlists 
end 

class Playlist < ActiveRecord::Base 
    belongs_to :user 
    validates :user_id, presence: true 
end 

Теперь я пытаюсь связать плейлисты пользователя внутри пользователя/show.html. Еврорадио файл:

<p> 
    <%= link_to "Playlists", user_playlists_path(@playlist)%></p> 
</p> 

Что приводит меня к странице Списки воспроизведения (/ пользователей/1/плейлистов) успешно, но когда я пытаюсь добавить пе ж воспроизведения для этого пользователя, я получаю следующее сообщение об ошибке:

Showing /app/views/playlists/_form.html.erb where line #1 raised: 

undefined method `playlists_path' for #<#<Class:0x0000000335c688>:0x00000003d0b238> 

Это строка # 1:

<%= form_for(@playlist) do |f| %> 

Это то, что я получаю за rake routes, если это помогает на всех:

  Prefix Verb URI Pattern         Controller#Action 
    user_playlists GET /users/:user_id/playlists(.:format)   playlists#index 
        POST /users/:user_id/playlists(.:format)   playlists#create 
new_user_playlist GET /users/:user_id/playlists/new(.:format)  playlists#new 
edit_user_playlist GET /users/:user_id/playlists/:id/edit(.:format) playlists#edit 
    user_playlist GET /users/:user_id/playlists/:id(.:format)  playlists#show 
        PATCH /users/:user_id/playlists/:id(.:format)  playlists#update 
        PUT /users/:user_id/playlists/:id(.:format)  playlists#update 
        DELETE /users/:user_id/playlists/:id(.:format)  playlists#destroy 
      users GET /users(.:format)        users#index 
        POST /users(.:format)        users#create 
      new_user GET /users/new(.:format)       users#new 
     edit_user GET /users/:id/edit(.:format)     users#edit 
       user GET /users/:id(.:format)       users#show 
        PATCH /users/:id(.:format)       users#update 
        PUT /users/:id(.:format)       users#update 
        DELETE /users/:id(.:format)       users#destroy 
       root GET /           default_pages#home 
      signup GET /signup(.:format)       users#new 
      signin GET /signin(.:format)       users#signin 

ответ

2

Ошибка:

undefined method `playlists_path' for #<#<Class:0x0000000335c688> 

и

user_playlist GET /users/:user_id/playlists/:id(.:format)

дают четкую причину ошибки у вас есть.

<%= form_for(@playlist) do|f| %> 

должен быть

<%= form_for([@user, @playlist]) do|f| %> 

Или current_user, что важно, вы должны передать user объект.

Объяснение:

Если вы заметили в update действия (с учетом, что вы перенаправлять на шоу-странице после обновления) вместо redirect_to user_path(@user) мы можем сделать только redirect_to @user, из которого Rails делает вывод, что вы переадресацией на путь отображения пользователя.

Это аналогичная ситуация здесь, так же, если у вас возникли form_for для воспроизведения и вы передаете только @playlist вместо [@user, @playlist] того woud попытаться найти new_playlist_path, который не находится в вашем маршруте и выводит сообщение об ошибке.

Это короткий gist о том, как вы можете это сделать.

+0

Имеет смысл, спасибо. Я попытался заменить @playlist на [@user, @playlist], и я получаю ту же ошибку. Что еще это может быть? – user2804881

+0

сменил его с @playlist на "[: user, @playlist]". Но теперь, когда я отправляю новый плейлист, он жалуется на большее количество маршрутов плейлистов. Есть много мест с «@playlist» ... нет ли способа генерировать правильные пути, чтобы мне не пришлось исправлять все эти ошибочные пути? – user2804881

+0

У вас есть @user в новом плейлисте.controller.rb? обновите код или указате свои коды на gist.github.com, чем меньше вы покажете нам, тем меньше мы сможем помочь :) – argentum47

1

Это:

<%= form_for(@playlist) do |f| %> 

Должно быть Это:

<%= form_for [@user, @playlist] do |f| %> 

примечания квадратных скобок