当我想要创建一本新书时,我需要将它附加到类别中。但是当我试图保存一本新书时,我得到了一个错误:“无法找到带有< id”=的类别。>我不知道为什么,除了我已经附加的id之外,还有一个id附加。这个id是空的( "“)。它看起来是这样的(”=> {"name“=> "12","category_ids”“=>”,"2","7",.)。请帮帮我。我的书记员:
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 %>
我的错误:在这里输入图像描述
发布于 2017-10-12 15:55:22
如果正确设置了关联,则为:
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
设置器和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
参数:
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
您的代码将无法工作,因为您使用的是.find
和可以为零或空的数组param。
collection_select的options参数也是可选的:
<%= form_for (@book) do |f| %>
<%= f.collection_select :category_ids, Category.order(:name), :id, :name, { multiple: :true } %><br>
<% end %>
https://stackoverflow.com/questions/46713309
复制相似问题