Невозможно массово назначить защищенные атрибуты для вложенной формы с помощью кокона и simple_forms в приложении Rails 3.

Проблема:

При отправке формы я получаю сообщение об ошибке:

ActiveModel::MassAssignmentSecurity::Ошибка в AdmissionRecordsController#create

Невозможно массово назначить защищенные атрибуты: accept_record

Моя установка:

Я использую Rails 3.2.3 с дополнительными драгоценными камнями, включая Cocoon 1.0.14 и Simple_Form 2.0.2.

Вид:

Мой app/views/admission_records/_form.html.haml выглядит так:

= simple_form_for [@admission, @record] do |f|
  = f.simple_fields_for :vital_signs, @record.vital_signs.build do |vs|
    = render :partial => "vital_sign_fields", :locals => { :f => vs }
    = link_to_add_association "Add Vital Signs", f, :vital_signs
  = f.submit

И мой app/views/admission_records/_vital_sign_fields.html.haml выглядит так:

.nested-fields
  = f.label :sbp
  = f.text_field :sbp
  ...
  = link_to_remove_association "Remove Vital Sign"

Что я в основном пытаюсь сделать, так это то, что у меня есть ресурс с именем AdmissionRecord, вложенный в другой ресурс с именем PatientAdmission (route.rb, показанный ниже). У меня есть еще один ресурс с именем VitalSign, который я хочу создать с помощью вложенной формы (используя кокон и simple_form) при создании AdmissionRecord

Мой файл config/routes.rb выглядит так:

resources :patient_admissions do
  resources :admission_records
end

Модели:

Мой app/models/patient_admission.rb выглядит так:

class PatientAdmission < ActiveRecord::Base
  has_many :admission_records, :dependent => :destroy
end

Мой app/models/admission_record.rb выглядит так:

class AdmissionRecord < ActiveRecord::Base
  belongs_to :patient_admission
  has_many :vital_signs, :dependent => :destroy

  accepts_nested_attributes_for :vital_signs, :rejects_if => :all_blank, :allow_destroy => true
  attr_accessible :vital_signs_attributes
end

А мой app/models/vital_sign.rb выглядит так:

class VitalSign < ActiveRecord::Base
  belongs_to :admission_record
  attr_accessible # just fields that appear in the form
end

Контролер:

Методы new и create в моем AdmissionRecordsController выглядят так:

before_filter do
  @admission = PatientAdmission.find(params[:patient_admission_id])
end

def new
  @record = @admission.admission_records.build
end

def create
  @record = @admission.admission_records.build(params[:admission_record])
  @vital_sign = @record.vital_signs.build(params[:vital_signs])
  @vital_sign.save
  if @record.save
    # Flash success and redirect to the right place
  else
    # Flash error and render :new
  end
end

Призыв:

Пожалуйста, помогите мне найти, где я ошибаюсь. Я часами гуглил и просматривал другие примеры и исходный код демонстрационных приложений, таких как найденные в cocoon_simple_form_demo, но по-прежнему не может исправить эту ошибку. Если есть какая-либо другая информация, необходимая для отладки этой проблемы, сообщите мне. Спасибо!


person oort    schedule 29.05.2012    source источник
comment
Не могли бы вы добавить журналы для этого запроса? Также в последних версиях Rails все атрибуты защищены по умолчанию. Поэтому, когда вы пишете .build(params[:admission_record]), вы должны указать атрибуты как доступные.   -  person Mark Huk    schedule 28.06.2012


Ответы (1)


Хорошо, у меня только что была эта проблема, и я исправил ее, введя одну строку кода в модель created_to.

# patient_admission.rb
Class PatientAdmission < ActiveRecord::Base
  attr_accessible :admission_record_attributes

  accepts_nested_attributes_for :admission_record

  ...
end

Вот другое решение :)

person Joe Mellin    schedule 03.05.2013