Rails4:强参数+嵌套属性+多重select

Rails 4: Strong parameters + nested attributes + multiple select

我有一个名为 TaxCategory 的模型,即 has_many :tax_ratesaccepts_nested_attributes_for :tax_rates, reject_if: :all_blank, allow_destroy: true

TaxRates 本身就是一个模型,除此之外,has_and_belongs_to_many :countries.

这些关系工作正常,我可以通过控制台添加和删除国家/地区。

但是,我有一个包含 fields_for :tax_rates do |g|.

的 TaxCategory 表单

在这里面,我有一个

g.select :country_ids, Country.collect{|c| [c.name, c.id]}, {multiple: true}, {}

它提交给 tax_categories 控制器,后者使用以下代码更新 TaxCategory

class TaxCategoriesController
  before_action :set_tax_category, only: [:show, :edit, :update, :destroy]

 ...*snip*...

  def update
     respond_to do |format|
      if @tax_category.update(tax_category_params)
        format.html { redirect_to [:dashboard,  @tax_category], notice: 'Tax Category was successfully updated.' }
        format.json { render :show, status: :ok, location: @tax_category }
      else
        format.html { render :edit }
        format.json { render json: @tax_category.errors, status: :unprocessable_entity }
      end
    end

    private

  def set_tax_category
    @tax_category = TaxCategory.find(params[:id])
  end

  def tax_category_params
    params.require(:tax_category).permit(:name, tax_rates_attributes:[:id, :rate,{country_ids: []}, :_destroy])
  end


end

但是,这有效;提交表单时,只保存第一个国家,Rails命令行显示Unpermitted parameter: country_ids信息。

我认为这是由 params.permit 引起的问题,但我不明白我做错了什么。

出了什么问题,我该如何解决?

更新

我想我找到了问题所在。您的示例参数说 country_ids: 1,其中它应该是 country_ids: [1],因为它应该是一个数组/多个值。

将以下内容更新为:

g.select :country_ids, Country.collect{|c| [c.name, c.id]}, {}, {multiple: true}
Unpermitted Params 错误感觉很可能是“tax_category_params”问题。你能试试这个吗 定义 tax_category_params params.require(:tax_category).permit(:name, tax_rates_attributes: [:id, :rate, country_ids: [], :_destroy]) 结尾