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