У меня есть модель под названием TaxCategory
, что has_many :tax_rates
и accepts_nested_attributes_for :tax_rates, reject_if: :all_blank, allow_destroy: true
.Рельсы 4: Сильные параметры + вложенные атрибуты + множественный выбор
TaxRates
сам по себе является моделью, которая, среди прочего, has_and_belongs_to_many :countries
.
Эти отношения хорошо работают, и я могу добавлять и удалять страны через консоль.
Однако, у меня есть форму для TaxCategory, которая содержит 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
, но я не понимаю, что я делаю неправильно.
Что происходит не так, и как я могу это исправить?
Это оказывается быть недействительным синтаксисом Ruby, так как интерпретатору не удается определить, как его обернуть как хэш (что, как мне кажется, связано с [именованными параметрами] (http://brainspec.com/blog/2012/10/08/keyword-arguments-ruby-2-0 /). Поместив его в конец, вот так: 'params.require (: tax_category) .permit (: name, tax_rates_attributes: [: id,: rate,: _destroy, country_ids: []]) 'не выводит синтаксическую ошибку, но все равно имеет тот же результат, что и выше, например,' Unpermitted parameter: country_ids' – Qqwy
Хм .. можете ли вы «ставить params» внутри действия обновления? Мне любопытно s ee фактические параметры запроса. «Tax_category_params» выглядит хорошо для меня. –
Параметры, которые отправляются на запрос: '{" utf8 "=>" ✓ "," authenticity_token "=>" 424242VHWTNtNTDzPhV9U1aV + t1d2VBx9 + heakYGSyozK + MkYvCPc3JJZIB + zSXn2vsqucZQ/P2J8F8ale2Yw == "," tax_category "=> {" name "=>" General "," tax_rates_attributes "=> {" 0 "=> {" rate "=>" 21.0 "," country_ids "=>" 1 "," _destroy "=>" false "," id " => "1"}, "1" => {"rate" => "10.0", "country_ids" => "2,3,4", "_destroy" => "false", "id" => " 3 "}}}," button "=>" "," id "=>" 1 "}', что выглядит хорошо для меня. – Qqwy