Создайте запись таблицы соединений автоматически, рельсы 3 - PullRequest
1 голос
/ 13 февраля 2011

Прямо сейчас модель моих сообщений has_many: tags,: through =>: tag_joins

Когда я добавляю теги при создании записи, записи tag_join создаются автоматически.

Теперь вот что я пытаюсь сделать: при просмотре представления сообщений в шоу я хочу добавить новый тег.

Я пытался @ post.tag = Tag.new не работал (возвращает «nomethoderror» для тега =)

Поэтому я пытаюсь выяснить, как я могу добавлять теги и при этом автоматически создавать эти объединения.

Я использую accepts_nested_attributes и т. Д.

ОБНОВЛЕНИЕ: Первоначально я спросил, как это сделать в представлении индекса, но я изменил его в представление представления - потому что я ожидаю, что это будет немного проще.

Ответы [ 3 ]

1 голос
/ 13 февраля 2011

Вы не слишком далеко с @posts.tags = Tag.new. Вот несколько способов сделать это:

@post.tags << Tag.create(params[:tag])
@post.tags.create params[:tag]

Я вижу пару подходов к этой проблеме. Один из них заключается в том, чтобы пройти через идентификатор сообщения с помощью формы тега, используя hidden_field или используя вложенные маршруты для тегов. Затем вы можете использовать это в контроллере, чтобы получить сообщение и использовать синтаксис, подобный приведенному выше.

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

Более изящный способ справиться с этим - сделать форму, которую вы показываете, формой для почтового экземпляра, а не тегом. Тогда вы можете использовать вложенные атрибуты для создания тега как части поста.

0 голосов
/ 17 августа 2015

Ключевое наблюдение здесь - это разница между .new и .create.Для моего приложения Devour.space я столкнулся с той же проблемой.Если вы создаете объект в памяти, используя:

tag = @post.tags.new(tag_params)
tag.save

В базе данных не будет сохранено ни одной записи tag_joins.@ post.tags не вернет ваш новый тег.Вы должны использовать .create в момент создания экземпляра, иначе связь не будет записана в таблицу JOIN:

tag = @post.tags.create(tag_params)
@post.tags.last # tag

В моей ситуации это потребовало изменения в том, как мое действие create обрабатывает запросы и ошибки:1007 *

has_many :deck_shares
has_many :decks, through: :deck_shares
....

deck = current_user.decks.new(deck_params)
if deck.save # Does not create entry in DeckShares table
  render json: deck
else
  render json: deck.errors, as: :unprocessable_entity
end

Это стало:

begin
  deck = current_user.decks.create(deck_params) # creates DeckShare
rescue Exception => e
  render json: e, as: :unprocessable_entity
end
render json: deck unless e
0 голосов
/ 13 февраля 2011

Посмотрите на методы build_xxx или create_xxx, которые ассоциация (own_to, has_many и т. Д.) добавляет к моделям . Вам нужно создать свой тег через сообщение, чтобы рельсы автоматически «подключили» его.

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