Rails collection_select not getting an id



我正试图进一步了解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_idnil

在表单中,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,因为这是外键属性

相关内容

  • 没有找到相关文章

最新更新