Rails4:强参数+嵌套属性+多重select
Rails 4: Strong parameters + nested attributes + multiple select
我有一个名为 TaxCategory
的模型,即 has_many :tax_rates
和 accepts_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])
结尾
我有一个名为 TaxCategory
的模型,即 has_many :tax_rates
和 accepts_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|
.
在这里面,我有一个
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}