Rails collection_select 未获取 ID

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>

谢谢....任何解释的帮助将不胜感激。

f.collection_select(:category_ids

第一个参数应该是:category_id因为这是外键属性

我发现代码中有两个问题。您已经注意到对象上的 category_idnil

查看 collection_select 帮助程序设置 category_ids 的表单,但您的模型的属性名为 category_ids。只需删除复数 s

<%= f.collection_select(:category_id, Category.all, :id, :name,
        # ... %>

另一个问题是控制器中 StrongParameters 的配置。强参数方法正在处理参数散列,并且不知道存在 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