2014-01-29 2 views
1

저는 Ryan Bate 에피소드 # 285의 첫 번째 부분을 따릅니다. 왜 작동하지 않는지 확실하지 않습니다.Rails collection_select가 레코드를 생성하지 않습니다. - nil id

모델 :

<%= 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 

, 내가 얻을 기록 새로운 만화를 만들기위한

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 

형태로 여기에 코드입니다 :

문제는 genre_id가 nil이지만 올바른 값을 전달하는 방법을 모르겠다는 것입니다.

감사합니다.

+1

은 선택 컬렉션을 구축 할 양식 빌더를 사용하여 [: 사용자] [: 만화] [: genre_ids를] ' – MrYoshiji

+0

사과드립니다. 나는 f.collection_select를 입력하려고했다. ... comics_genre 테이블에 매개 변수를 쓰는 데 어려움을 겪고있다. – Jayway

답변

1

나는 그것을 알아 냈다. params에 대한 Mr Yoshi에게 감사드립니다. 이 폼은 @ genre_ids 변수로 설정 한 일련의 장르 ID를 제공합니다. 만화가 저장된 후에 해당 배열을 반복하고 각 장르 ID를 만화 ID로 저장하여 만화 및 장르의 커넥터 인 comics_genres 테이블에 대한 레코드를 만듭니다.

혼란스러운 부분은 저장 후에 만 ​​만화 ID를 생성하기 때문에 만화가 저장 될 때까지는 ComicsGenre 인스턴스를 저장할 수 없다는 것이 었습니다.

이것이 최선의 방법이 아닌지 알려주십시오. 나는 더 우아한 방법이있을 것이라고 확신한다. genre_ids (등) '이 양식 빌더 것이다 범위'의 PARAMS에서 collection_select 사용 :`f.collection_select을 :

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 
관련 문제