2017-10-12 71 views
0

當我想創建一本新書時,我需要將它附加到類別。但是當我嘗試保存一本新書時,出現錯誤:「找不到與< ID相同的類別」=「。>我不知道爲什麼,但除了已經附加的附加內容外,還有一個附加ID。 (「book」=> {「name」=>「12」,「category_ids」=> [「」,「2」,「7」],...)是空(012)。 。)請幫助我 我bookcontroler:多選:附加一個空的ID

def new 
@book = Book.new(book_params) 
end 

def create 
@book = Book.new(book_params) 
@category = Category.find(id: params[:ids]) 
BookCategory.create!(book: @book, category: @category) 
@book.save 
end 

private 

def book_params 
params.require(:book).permit(:name, :author, :image, :description) 
end 

我的表格:

<%= form_for (@book) do |f| %> 
     <%= f.collection_select :category_ids, Category.order(:name), :id, :name, {},{ multiple: :true } %><br> 
    <% end %> 

我的錯誤:enter image description here

回答

0

只要你已經設置了正確的關聯:

class Book < ApplicationRecord 
    has_many :book_categories 
    has_many :categories, through: :book_categories 
end 

class Category < ApplicationRecord 
    has_many :book_categories 
    has_many :books, through: :book_categories 
end 

class BookCategory < ApplicationRecord 
    belongs_to :book 
    belongs_to :category 
end 

has_many協會的ActiveRecord創建一個_ids setter和getter:

@book = Book.find(1) 
@book.category_ids 
# => [1, 2, 3] 
@book.category_ids = [2,4] # will add 4 and remove 1 and 3. 

所以,你不需要手動設置的關聯,只是通過category_ids PARAM:

def new 
@book = Book.new # don't assign params in the new method! 
end 

def create 
    @book = Book.new(book_params) 
    if @book.save 
    redirect_to @book 
    else 
    render :new 
    end 
end 

private 

def book_params 
    # category_ids: [] allows an array of scalar values 
    params.require(:book) 
     .permit(:name, :author, :image, :description, category_ids: []) 
end 

,因爲你正在使用您的代碼將無法正常工作0與一個數組參數可以是零或空。

也爲collection_select選項參數是可選的:

<%= form_for (@book) do |f| %> 
    <%= f.collection_select :category_ids, Category.order(:name), :id, :name, { multiple: :true } %><br> 
<% end %>