我正试图进一步了解Rails表单控件中的collection_select是如何工作的。
项目控制器
class ItemsController < ApplicationController
def index
@items = Item.all
end
def new
@item = Item.new
@categories = Category.all
end
def create
@item = Item.new(params.require(:item).permit(:name, :description, :category))
render plain: @item.inspect
# @item.save
# redirect_to my_page_path
end
def show
@item = Item.find(params[:id])
end
end
HTML
<div class="form-group">
<%= f.label :category %>
<%= f.collection_select(:category_ids, Category.all, :id, :name,
{ prompt: "Make your selection from the list below"}, { multiple: false, size: 1, class: "custom-select shadow rounded" }) %>
</div>
当我呈现代码时,我得到category_id=nil
#<Item id: nil, name: "Yo", description: "Brand new", created_at: nil, updated_at: nil, category_id: nil>
谢谢。。。。如能提供任何解释,我们将不胜感激。
我在代码中看到了两个问题。您已经注意到对象上的category_id
是nil
。
在表单中,collection_select
辅助对象设置了一个category_ids
,但模型的属性名为category_ids
。只需移除复数s
<%= f.collection_select(:category_id, Category.all, :id, :name,
# ... %>
另一个问题是控制器中StrongParameters
的配置。强params方法正在处理params哈希,不知道存在category
关联,也不知道该关联与category_id
一起工作。因此,您需要精确地将category_id
添加到列表中:
def create
@item = Item.new(params.require(:item).permit(:name, :description, :category_id))
render plain: @item.inspect
# @item.save
# redirect_to my_page_path
end
f.collection_select(:category_ids
第一个参数应该是:category_id
,因为这是外键属性