У меня есть Bill
объект, в котором много Due
объектов. Due
Объект также принадлежит к Person
. Мне нужна форма, которая может создавать объект Bill
и его дочерние Dues
элементы на одной странице. Я пытаюсь создать форму, используя вложенные атрибуты, похожие на те, что в этом Railscast .
Соответствующий код приведен ниже:
due.rb
class Due < ActiveRecord::Base
belongs_to :person
belongs_to :bill
end
bill.rb
class Bill < ActiveRecord::Base
has_many :dues, :dependent => :destroy
accepts_nested_attributes_for :dues, :allow_destroy => true
end
bills_controller.rb
# GET /bills/new
def new
@bill = Bill.new
3.times { @bill.dues.build }
end
счета / _form.html.erb
<%= form_for(@bill) do |f| %>
<div class="field">
<%= f.label :company %><br />
<%= f.text_field :company %>
</div>
<div class="field">
<%= f.label :month %><br />
<%= f.text_field :month %>
</div>
<div class="field">
<%= f.label :year %><br />
<%= f.number_field :year %>
</div>
<div class="actions">
<%= f.submit %>
</div>
<%= f.fields_for :dues do |builder| %>
<%= render 'due_fields', :f => builder %>
<% end %>
<% end %>
счета / _due_fields.html.erb
<div>
<%= f.label :amount, "Amount" %>
<%= f.text_field :amount %>
<br>
<%= f.label :person_id, "Renter" %>
<%= f.text_field :person_id %>
</div>
ОБНОВЛЕНИЕ до bills_controller.rb Это работает!
def bill_params
params
.require(:bill)
.permit(:company, :month, :year, dues_attributes: [:amount, :person_id])
end
Соответствующие поля отображаются на странице (хотя и без раскрывающегося списка Person
), и отправка прошла успешно. Однако ни один из дочерних взносов не сохраняется в базе данных, и в журнал сервера выдается ошибка:
Unpermitted parameters: dues_attributes
Непосредственно перед ошибкой в журнале отображается следующее:
Started POST "/bills" for 127.0.0.1 at 2013-04-10 00:16:37 -0700
Processing by BillsController#create as HTML<br>
Parameters: {"utf8"=>"✓",
"authenticity_token"=>"ipxBOLOjx68fwvfmsMG3FecV/q/hPqUHsluBCPN2BeU=",
"bill"=>{"company"=>"Comcast", "month"=>"April ",
"year"=>"2013", "dues_attributes"=>{
"0"=>{"amount"=>"30", "person_id"=>"1"},
"1"=>{"amount"=>"30", "person_id"=>"2"},
"2"=>{"amount"=>"30", "person_id"=>"3"}}}, "commit"=>"Create Bill"}
Произошли ли какие-то изменения в Rails 4?
источник
Ответы:
Кажется, произошли изменения в обработке защиты атрибутов, и теперь вы должны занести в белый список параметры в контроллере (вместо attr_accessible в модели), потому что бывший необязательный gem strong_parameters стал частью Rails Core.
Это должно выглядеть примерно так:
Так
params.require(:model).permit(:fields)
будет использоватьсяа для вложенных атрибутов что-то вроде
Более подробную информацию можно найти в документации Ruby edge API и strong_parameters на github или здесь
источник
def bill_params params.require(:bill).permit(:company, :month, :year, :dues_attributes[:amount, :person_id]) end
теперь я получаю эту ошибку: нет неявного преобразования символа в целое числоpets_attributes: [:id, :name, :category]
В противном случае при редактировании каждый питомец будет создан заново.Person.create(person_params)
иначе он не вызовет метод. Вместо этого вы получитеActiveModel::ForbiddenAttributesError
.:_destroy
параметр в белый список . iepets_attributes: [:id, :name, :category, :_destroy]
Из документов
Вложенные атрибуты имеют форму хеша. В моем приложении у меня есть модель Question.rb, принимающая вложенные атрибуты для модели Answer.rb (где пользователь создает варианты ответа для вопроса, который он создает). В questions_controller я делаю это
В хэше вопроса разрешено все, включая вложенные атрибуты ответа. Это также работает, если вложенные атрибуты имеют форму массива.
Сказав это, мне интересно, есть ли проблема с безопасностью в этом подходе, потому что он в основном разрешает все, что находится внутри хэша, без точного указания, что это такое, что кажется противоречащим цели строгих параметров.
источник
.permit!
единственный вариант? Я не могу заставить его работать даже со всеми разрешенными атрибутами модели, потому что он задыхается от массива.или вы можете просто использовать
источник
На самом деле есть способ просто занести в белый список все вложенные параметры.
Этот метод имеет преимущество перед другими решениями. Это позволяет разрешить глубоко вложенные параметры.
В то время как другие решения, такие как:
Не.
Источник:
https://github.com/rails/rails/issues/9454#issuecomment-14167664
источник
Сегодня я столкнулся с той же проблемой, работая над рельсами 4, я смог заставить ее работать, структурировав свои поля fields_for как:
Затем в моем контроллере у меня есть сильные параметры:
Все работает!
источник
Если вы используете поле JSONB, вы должны преобразовать его в JSON с помощью .to_json (ROR)
источник