Создание нового потомка во вложенных маршрутах

Этот сводит меня с ума. У меня есть вложенные отношения между двумя моделями в моем проекте, и я решил, что не хочу, чтобы они были поверхностными, поскольку дочерний объект (годы) не имеет значения вне контекста родительского ( фестивали).

Таким образом, я как бы уменьшил связь везде, где мог найти ссылку на нее, но я обнаружил, что не могу получить доступ к странице для создания нового дочернего объекта.

Вот URL, как я понимаю, должен быть: /festivals/1/years/new

из route.rb:

resources :festivals do
   resources :years
end

Из years_controller.rb:

# GET festivals/1/years/new
# GET festivals/1/years/new.json
def new
  @festival = Festival.find(params[:festival_id])
  @year = @festival.years.build

  respond_to do |format|
    format.html # new.html.erb
    format.json { render :json => @year }
  end
end

И кнопка, которую пользователи нажимают, чтобы перейти на новую страницу (на страницу Показать для родительского объекта):

<%= link_to 'Add Year', new_festival_year_path(@festival), :class => 'btn' %>

Это приводит пользователя к правильному URL-адресу, но я получаю:

No route matches {:action=>"show", :controller=>"years", :festival_id=>#<Festival id: 7, name: "Improganza", founded: nil, logo: "", mission: "This is that one that people spend a lot of money t...", city: "Honolulu", state_code: "HI", country_code: "US", created_at: "2013-07-26 14:49:19", updated_at: "2013-07-26 14:49:19">}

Я создал новый проект Rails и настроил скаффолды, используя гем Akria Matsuda nested_scaffold, просто чтобы сравнить результат с моим кодом... результирующие файлы выглядят так, как я показал здесь. Я понятия не имею, что мне может не хватать.

На всякий случай вывод моего rake routes:

            festival_years GET        /festivals/:festival_id/years(.:format)          years#index
                           POST       /festivals/:festival_id/years(.:format)          years#create
         new_festival_year GET        /festivals/:festival_id/years/new(.:format)      years#new
        edit_festival_year GET        /festivals/:festival_id/years/:id/edit(.:format) years#edit
             festival_year GET        /festivals/:festival_id/years/:id(.:format)      years#show
                           PUT        /festivals/:festival_id/years/:id(.:format)      years#update
                           DELETE     /festivals/:festival_id/years/:id(.:format)      years#destroy
                 festivals GET        /festivals(.:format)                             festivals#index
                           POST       /festivals(.:format)                             festivals#create
              new_festival GET        /festivals/new(.:format)                         festivals#new
             edit_festival GET        /festivals/:id/edit(.:format)                    festivals#edit
                  festival GET        /festivals/:id(.:format)                         festivals#show
                           PUT        /festivals/:id(.:format)                         festivals#update
                           DELETE     /festivals/:id(.:format)                         festivals#destroy
                           GET        /festivals(.:format)                             festivals#index
                           POST       /festivals(.:format)                             festivals#create
                           GET        /festivals/new(.:format)                         festivals#new
                           GET        /festivals/:id/edit(.:format)                    festivals#edit
                           GET        /festivals/:id(.:format)                         festivals#show
                           PUT        /festivals/:id(.:format)                         festivals#update
                           DELETE     /festivals/:id(.:format)                         festivals#destroy

person monkeyangst    schedule 30.07.2013    source источник
comment
Когда вы видите эту ошибку «нет маршрута», связана ли она со строкой в ​​вашем шаблоне?   -  person bgates    schedule 31.07.2013
comment
Нет, только тот текст, который я процитировал.   -  person monkeyangst    schedule 31.07.2013


Ответы (3)


Попробуй это:

<%= link_to 'Add Year', new_festival_year_path(@festival.id, :class => 'btn' %>    

or

<%= link_to 'Add Year', new_festival_year_path({festival_id: @festival.id}, :class => 'btn' %>

в соответствии с ошибкой, которую вы получаете

:festival_id=>#<Festival id: 7, name: "Improganza", founded: nil, logo: "", mission: "This is that one that people spend a lot of money t...", city: "Honolulu", state_code: "HI", country_code: "US", created_at: "2013-07-26 14:49:19", updated_at: "2013-07-26 14:49:19">}

маршрутизатор получает весь ваш фестивальный параметр в качестве входных данных для :festival_id

person dax    schedule 30.07.2013
comment
Спасибо, но это оказывается не так... на самом деле, то же самое исключение происходит, если я не использую ссылку "Добавить год", а вместо этого перехожу напрямую к `/festivals/1/years/new'! - person monkeyangst; 31.07.2013
comment
ты имеешь в виду во взгляде? Я не думаю, что это поможет, так как выдает ту же ошибку, если я просто перейду к URL-адресу напрямую. Но я попробую. - person monkeyangst; 31.07.2013
comment
На самом деле, @dax, это ломает представление. - person monkeyangst; 31.07.2013

Я думаю, что вы объединяете действия #new и #year в years_controller, и это может вызвать некоторые проблемы.

# GET festivals/1/years/new
# GET festivals/1/years/new.json
def new
  @festival = Festival.find(params[:festival_id])
  @year = @festival.years.build
end

def create
  @festival = Festival.find(params[:festival_id])
  @year = @festival.years.create(...)
  #...fill in the rest of the method...
end

Вы также должны обновить свою ссылку:

<%= link_to 'Add Year', new_festival_year_path(festival_id: @festival), :class => 'btn' %>

Я создал короткую викторину по вложенным ресурсам, которая может оказаться полезной.

person Powers    schedule 30.07.2013
comment
Это тоже оказалось не то. И действие #create на самом деле уже выглядело так, как оно у вас есть. - person monkeyangst; 31.07.2013
comment
ОБНОВЛЕНИЕ: я обнаружил, что проблема заключается в представлении, а не в контроллере, в частности, в партиале _form.html.erb. Теперь я должен быть в состоянии сузить, где именно. Спасибо всем за вашу помощь. - person monkeyangst; 31.07.2013

Ответ был довольно глупым. В моем журнале сервера Rails (на который мне нужно приучить себя обращать больше внимания) я увидел несколько строк, указывающих на проблему в строке 63 моего партиала _form.html.erb.

Эта строка была:

<%= link_to t('.cancel', :default => t("helpers.links.cancel")),
   festival_year_path(@festival), :class => 'btn' %>

Упс. Почему я вообще решил, что кнопка "Отмена" должна переносить вас на год (которого, конечно же, не существует), мне не понятно. Я изменил его на festival_path(@festival), и все в порядке.

Спасибо всем за вашу помощь. Я новичок в StackOverflow и в Rails в целом. Мне очень приятно, что я получил такие быстрые ответы!

person monkeyangst    schedule 31.07.2013