Rails collection_select不创建记录 - nil id

时间:2014-01-29 18:05:26

标签: ruby-on-rails ruby forms grouped-collection-select

我正在关注Ryan Bate第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是零,但我不知道如何让它传递正确的值。

非常感谢!

1 个答案:

答案 0 :(得分:1)

我明白了。感谢MrYoshi的参数。该表单提供了一系列类型id,我将其设置为变量@genre_ids。保存漫画后,我遍历该数组,并使用漫画ID保存每个类型ID,以创建comics_genres表的记录,这是漫画和流派的连接器。

令人困惑的部分是,在保存漫画之前保存ComicsGenre实例是不可能的,因为它只会在保存后生成漫画ID。

如果这不是最好的方法,请告诉我!我相信有更优雅的方式。

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