2014-01-29 58 views
1

我正在關注Ryan Bate第285集的第一部分。不知道爲什麼它不起作用。下面是代碼:Rails collection_select not create records - 無編號

型號:

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

只需使用表單生成器來構建集合中選擇:'f.collection_select:genre_ids(ETC)'用這個表格Builder將範圍在'PARAMS的collection_select [:用戶] [:漫畫] [:genre_ids] ' – MrYoshiji

+0

我的歉意。我的意思是鍵入f.collection_select ... 我想我很難將參數寫入comics_genre表。 – Jayway

回答

1

我想通了。感謝MrYoshi提供的參數。表單提供了一個我設置爲變量@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