Rails collection_select не создает записи - nil id

Я следую за первой частью эпизода Райана Бэйта № 285. Не уверен, почему это не работает. Вот код:

модели:

class Comic < ActiveRecord::Base
    has_many :comics_genres
    has_many :genres, through: :comics_genres
end

class ComicsGenre < ActiveRecord::Base
    belongs_to :genre
    belongs_to :comic
end

class Genre < ActiveRecord::Base
    has_many :comic_genres
    has_many :comics, through: :comics_genre
end

Форма для создания новых комиксов:

  <%= form_for ([@user, @comic]) do |f| %>
    <div><%= f.collection_select :genre_ids, Genre.order(:genre), :id, :genre, {}, {multiple: true} %></div>

      <%= f.submit class: "btn btn-primary" %>
  <% end %>

Комический контроллер:

def create
    @user = current_user
    @comic = @user.comics.new(comic_params)

    respond_to do |format|
      if @comic.save
        format.html { redirect_to @comic, notice: 'Comic was successfully created.' }
        format.json { render action: 'show', status: :created, location: @comic }
      else
        format.html { render action: 'new' }
        format.json { render json: @comic.errors, status: :unprocessable_entity }
      end
    end
  end

def comic_params
      params.require(:comic).permit(:id, :title, :synopsis,
        comic_pages_attributes: [:comic_page_image],
        comics_genres_attributes: [:genre_id, :comic_id])
    end

В консоли я получаю такие записи:

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

Большое спасибо!

1 ответ

Я понял. Спасибо мистеру Йоши за параметры. Форма предоставляет массив идентификаторов жанра, которые я установил в переменную @genre_ids. После сохранения комикса я перебираю этот массив и сохраняю каждый жанровый идентификатор с комическим идентификатором для создания записей для таблицы comics_genres, которая является соединителем для комиксов и жанров.

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

Пожалуйста, дайте мне знать, если это не лучший способ сделать это! Я уверен, что есть более элегантный способ.

def create
    @user = current_user
    @comic = @user.comics.new(comic_params)
    @genre_ids = params[:comic][:genre_ids]

    respond_to do |format|
      if @comic.save

        @genre_ids.each do |genre_id|
          ComicsGenre.create(:comic_id => @comic.id, :genre_id => genre_id)
        end

        format.html { redirect_to @comic, notice: 'Comic was successfully created.' }
        format.json { render action: 'show', status: :created, location: @comic }
      else
        format.html { render action: 'new' }
        format.json { render json: @comic.errors, status: :unprocessable_entity }
      end
    end
  end
Другие вопросы по тегам