Вложенные ресурсы — UrlGenerationError — Нет совпадений маршрутов

Я работаю над базовым приложением Rails. Чтобы все заработало, я создал два каркаса.

  • календарь
  • content_items

Затем я создал соответствующие ассоциации.

приложение/models/calendar.rb

class Calendar < ActiveRecord::Base
   has_many :content_items
end

приложение/модели/content_item.rb

class ContentItem < ActiveRecord::Base
  belongs_to :calendar
end

routes.rb

resources :calendars do
  resources :content_items
end

Однако теперь, когда я пытаюсь просмотреть content_items определенного календаря, я получаю следующую ошибку:

ActionController::UrlGenerationError — Маршрут не соответствует {:action=>"show", :calendar_id=>nil, :controller=>"content_items", :id=>"5"}, отсутствуют необходимые ключи: [:calendar_id]

В нем говорится, что ошибка исходит из: views/content_items/index.html.erb

<td><%= link_to 'Show', calendar_content_item_path(content_item.calendar, content_item) %></td>

Я пробовал несколько разных маршрутов, но они приводят к разным ошибкам. Нужно ли мне обновлять модель и/или контроллеры, так как я создал вложенные маршруты?


person JeremyE    schedule 25.05.2015    source источник
comment
в основном рельсы не могут генерировать URL-адрес только из объекта content_item. поскольку он вложен, вам также необходимо передать объект родительского календаря. проверьте документацию   -  person Alper Karapınar    schedule 25.05.2015


Ответы (2)


Попробуйте использовать

<td><%= link_to 'Show', calendar_content_item_path(content_item.calendar, content_item) %></td>

person Amit Badheka    schedule 25.05.2015
comment
Пробовал это. Я думаю, это ближе. Обновлен код и ошибка в исходном сообщении. - person JeremyE; 25.05.2015
comment
Обновил ответ, проверьте. Небольшая орфографическая ошибка :) - person Amit Badheka; 25.05.2015
comment
Снова обновил исходный пост. Меня смущает ошибка, потому что кажется, что идентификатор передается. - person JeremyE; 25.05.2015
comment
Есть ли какая-либо запись, в которой отсутствует calendar_id? Можете ли вы подтвердить, работает ли ассоциация? - person Amit Badheka; 25.05.2015
comment
Обе модели кажутся правильными, но я не уверен, что есть другой способ проверить. - person JeremyE; 25.05.2015
comment
Для проверки, просто в представлении, пока прокомментируйте ссылку и отобразите вместо нее content_item.calendar. Если вы получаете объект, он отлично работает - person Amit Badheka; 25.05.2015
comment
content_item.calendar не выдает ошибку, но имеет нулевое значение. - person JeremyE; 25.05.2015
comment
значит.. есть какие-то значения.. у которых нет calendar_id, можно поставить валидации и должно работать - person Amit Badheka; 25.05.2015
comment
Вот оно. Мне нужно было очистить базу данных от старых данных, у которых не было calendar_id. Я отмечу ваш ответ как правильный. Спасибо за вашу помощь! - person JeremyE; 26.05.2015
comment
Давайте продолжим обсуждение в чате. - person Amit Badheka; 26.05.2015

Вы забыли добавить суффикс _path к маршруту:

<td><%= link_to 'Show', content_items_path(calendar) %></td>
person alexandrine_greenfelder    schedule 25.05.2015
comment
Это приводит к следующему: неопределенная локальная переменная или метод `content_item_path' - person JeremyE; 25.05.2015
comment
+ забудьте использовать форму множественного числа: content_items_path - person alexandrine_greenfelder; 25.05.2015
comment
+ забудьте передать переменную calendar для идентификации связанного календаря - person alexandrine_greenfelder; 25.05.2015