Rails 3: пытаюсь подписаться на railscast # 17, чтобы добавить жанры в мои посты - PullRequest
0 голосов
/ 06 октября 2011

Я следовал в точности так, как описывает Railscast, но использовал «жанр» вместо «категория», но всякий раз, когда я делаю пост, genre_id отображается как NULL, и я получаю WARNING: can't mass assign attribute genre_ids

У меня было genre_id в моей почтовой модели attr_accessible, потому что это имя атрибута, однако, когда я изменяю его на genre_ids.Я получаю сообщение об ошибке ActiveRecord::StatementInvalid in PostsController#create Could not find table 'genres_posts'

почтовая форма

<% for genre in Genre.find(:all) %>
<div>
  <%= check_box_tag "post[genre_ids][]", genre.id, @post.genre.include?(genre) %>
  <%= genre.name %>
</div>
<% end %>

почтовая модель

class Post < ActiveRecord::Base

  has_and_belongs_to_many :genres

end

1 Ответ

1 голос
/ 06 октября 2011

У меня нет ответа, но вот что вы должны проверить:

  • В вашем коде строка <%= check_box_tag "post[genre_ids][]", genre.id, @post.genre.include?(genre) %> должна содержать genres, а не genre:

    <%= check_box_tag "post[genre_ids][]", genre.id, @post.genres.include?(genre) %>

  • Что Райан Бейтс (мне нравится его веб-трансляция) не говорит, так это то, что вам нужны изменения в вашей базе данных, чтобы ваши модели могли быть сохранены. Причина этого заключается в том, что в реляционной базе данных отношение m: n обычно реализуется отдельной таблицей, в которой хранится только это отношение. Взгляните на «Направляющие рельсы: имеет и принадлежит многим ассоциациям» .
  • Таким образом, вы должны сгенерировать автономную миграцию (см. Руководство по Rails для этого ), которая создает эту таблицу, в которой оба идентификатора - posts и genres в одной таблице. Поэтому таблица должна быть названа genres_posts и включать столбцы genre_id и post_id.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...