2016-07-18 1 views
0

에서 다중 선택 삽입하는 방법 : 분명히(가) 버튼을 누르면 다음과 같은 오류를 반환 제출 누르면 조인 테이블

Parameters: 

{"utf8"=>"✓", 
"authenticity_token"=>"/86GsyhAODP55TYKftsW64Lx1Quy5t/hfthlhG9bcto5+B9CwjejJGcMJyr5+IEpA8xi7FehmSv4cMNxvvadUg==", 
"author"=>{"name"=>"hector"}, 
"books"=>{"id"=>["", 
"2", 
"3"]}, 
"commit"=>"Create Author"} 

내가 무슨 모른다 :

NoMethodError in AuthorsController#create 
undefined method `name' for Authorbook:0x007fe6e4284b28 

하고 요청의 매개 변수를 컨트롤러는 작성자의 이름을 매개 변수로 받아서 처리 할 수 ​​없습니다.

모델 :

class Author < ActiveRecord::Base 
    validates :name, :presence => true 
    has_many :authorbooks 
    has_many :books, :through => :authorbooks 
end 

class Authorbook < ActiveRecord::Base 
    validates :name, :presence => true 
    belongs_to :book 
    belongs_to :author 
end 

class Book < ActiveRecord::Base 
    validates :name, :presence => true 
    has_many :authorbooks 
    has_many :authors, :through => :authorbooks 
end 

컨트롤러 :

class AuthorsController < ApplicationController 
    before_action :set_author, only: [:show, :edit, :update, :destroy] 

    # GET /authors 
    # GET /authors.json 
    def index 
    @authors = Author.all 
    end 

    # GET /authors/1 
    # GET /authors/1.json 
    def show 
    end 

    # GET /authors/new 
    def new 
    @author = Author.new 

    @all_books = Book.all 

    @author_book = @author.authorbooks.build 
    end 

    # GET /authors/1/edit 
    def edit 
    end 

    # POST /authors 
    # POST /authors.json 
    def create 
    @author = Author.new(author_params) 

    params[:books][:id].each do |book| 
     if !book.empty? 
     @author.authorbooks.build(:book_id => book) 
     end 
    end 

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

    # PATCH/PUT /authors/1 
    # PATCH/PUT /authors/1.json 
    def update 
    respond_to do |format| 
     if @author.update(author_params) 
     format.html { redirect_to @author, notice: 'Author was successfully updated.' } 
     format.json { render :show, status: :ok, location: @author } 
     else 
     format.html { render :edit } 
     format.json { render json: @author.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # DELETE /authors/1 
    # DELETE /authors/1.json 
    def destroy 
    @author.destroy 
    respond_to do |format| 
     format.html { redirect_to authors_url, notice: 'Author was successfully destroyed.' } 
     format.json { head :no_content } 
    end 
    end 

    private 
    # Use callbacks to share common setup or constraints between actions. 
    def set_author 
     @author = Author.find(params[:id]) 
    end 

    # Never trust parameters from the scary internet, only allow the white list through. 
    def author_params 
     params.require(:author).permit(:name) 
    end 
end 

과 _form :

<%= form_for(@author) do |f| %> 
    <% if @author.errors.any? %> 
    <div id="error_explanation"> 
     <h2><%= pluralize(@author.errors.count, "error") %> prohibited this author from being saved:</h2> 

     <ul> 
     <% @author.errors.full_messages.each do |message| %> 
     <li><%= message %></li> 
     <% end %> 
     </ul> 
    </div> 
    <% end %> 

    <div class="field"> 
    <%= f.label :name %><br> 
    <%= f.text_field :name %> 
    </div> 

    <%= fields_for (@author_book) do |ab| %> 
    <div class="field"> 
     <%= ab.label "All Books" %> <br> 
     <%= collection_select(:books, :id, @all_books, :id, :name, {}, {:multiple => true}) %> 
    </div> 
    <% end %> 

    <div class="actions"> 
    <%= f.submit %> 
    </div> 
<% end %> 
+0

오류가 표시된 이미지의 링크를 제거하고 질문에 오류를 복사/붙여 넣기하십시오. 이미지를 사용하면 정보를 입력해야하므로 도움을받을 수 없습니다. 또한 링크가 부패 할 수 있으며 질문을 할 때 이해가되지 않습니다. "[mcve]"를 참조하십시오. 우리는 당신의 전문 기술에 대해 관심이 없으며, 우리는 잘 조사되고 질문하기를 원합니다. "[ask]"와 링크 된 페이지를 읽으십시오. 그들은 당신이 더 나은 질문을하는 것을 도울 것입니다. –

+0

알았어, 조언 주셔서 감사합니다. 변경이 이미 완료되었습니다. –

+0

Authorbook 테이블에 이름 열이 있습니까? 이름의 존재를 확인하려고 할 수 있으며 오류가 발생할 수 있습니다. –

답변

0

는 그냥

validates :name, :presence => true #Authorbook  
을 제거 모델에 해당 필드가 없으므로 "Authorbooks"에

을 입력하십시오. 기본적으로 레일즈에 존재하지 않는 필드의 유효성을 검사하도록 요청하는 것입니다.

+0

감사합니다. 매우 바보 같은 실수였습니다. 답장으로 문제가 해결됩니다. 참조하십시오. –

관련 문제