我在理解 Accept_nested_attributes_for 方面遇到了一些挑战。
我有一个由各种子类(地址、医生、监护人等)组成的住院医师类。我对使 Accepts_nested_attributes_for 工作所需步骤的理解如下:
- 创建必要的关联
- 将 Accepts_nested_attributes_for :resource 添加到父类,我将使用该父类的形式提交嵌套属性
- 像这样的白名单嵌套属性。 attr_accessible :地址属性、:医生属性等...
- 在父控制器中,构建关联的资源。即@resident.addresses.build(对于has_many关联),@resident.build_doctor(对于has_one关联)
- 为每个子资源添加 fields_for 块以包含其属性值。
我的居民记录中有该地址,但当我尝试添加其他类别时,我遇到了挑战。例如,医生也需要地址,监护人也需要地址。
我是否还会添加接受nested_attributes_for:address到我的doctor.rb模型?如果是这样,这是否意味着我需要一个该资源的控制器,并为其组件调用构建方法?现在是在我的表单模板中使用嵌套 fields_for 的时候了吗? (示例如下)
<%= f.fields_for :doc1 do |doc| %>
<%= doc.text_field :fname %>
<%= doc.text_field :lname %>
<%= doc.fields_for :address do |doc_address| %>
<%= doc_address.text_field :street_address %>
<%= doc_address.text_field :city %>
<%= doc_address.text_field :state %>
<% end %>
<%= doc.fields_for :primary_phone do |phone1| %>
<%= phone1.phone_field :area_code %>
<%= phone1.phone_field :number %>
<% end %>
<% end %>
以下是相关文件:
居民.rb
class Resident < ActiveRecord::Base
attr_accessible :address_attributes, :guardian_attributes, :desrep_attributes, :doctor_attributes,
:em_contact1_attributes, :em_contact2_attributes, :fname, :lname, :gender, :pic, :soc, :dob,
:marital_stat, :placement_name, :placement_address, :res_start_date,
:res_end_date, :religious_prefs, :insurance_info, :burial_provisions,
:case_number, :vet_stat_num, :admission_height, :admission_weight,
:resident_initials, :allergies,:admin_id
belongs_to :admin
has_one :address, as: :addressable
has_one :guardian
has_one :desrep, class_name: "DesignatedRepresentative"
has_one :doc1, class_name: "Doctor"
has_one :em_contact1, class_name: "EmergencyContact"
has_one :em_contact2, class_name: "EmergencyContact"
has_one :primary_phone, class_name: "PhoneNumber"
has_one :secondary_phone, class_name: "PhoneNumber"
has_many :assessment_plan_forms, dependent: :destroy
has_many :blood_pressure_record_forms, dependent: :destroy
has_many :fund_record_form1s, dependent: :destroy
has_many :fund_record_form2s, dependent: :destroy
has_many :incident_accident_forms, dependent: :destroy
has_many :med_record_forms, dependent: :destroy
has_many :personal_care_forms, dependent: :destroy
has_many :resident_care_agreement_forms, dependent: :destroy
has_many :visitation_appointment_forms, dependent: :destroy
has_many :weight_record_forms, dependent: :destroy
accepts_nested_attributes_for :address, allow_destroy: true
accepts_nested_attributes_for :guardian, allow_destroy: true
accepts_nested_attributes_for :desrep, allow_destroy: true
accepts_nested_attributes_for :doc1, allow_destroy: true
accepts_nested_attributes_for :em_contact1, allow_destroy: true
accepts_nested_attributes_for :em_contact2, allow_destroy: true
validates_presence_of :fname, :lname
def full_name
"#{ fname } #{ lname }"
end
def guard_fname
guarian.fname
end
end
地址.rb
class Address < ActiveRecord::Base
attr_accessible :street_address, :city, :state, :zip, :addressable_type, :addressable_id
belongs_to :addressable, polymorphic: true
end
医生.rb
class Address < ActiveRecord::Base
attr_accessible :street_address, :city, :state, :zip, :addressable_type, :addressable_id
belongs_to :addressable, polymorphic: true
end
紧急联系.rb
class EmergencyContact < ActiveRecord::Base
attr_accessible :address_attributes, :primary_phone_attributes, :secondary_phone_attributes, :fax_attributes,
:fname, :lname, :primary, :email, :resident_id
belongs_to :resident
has_one :address, as: :addressable
has_one :primary_phone, class_name: "PhoneNumber"
has_one :secondary_phone, class_name: "PhoneNumber"
has_one :fax, as: :phoneable
accepts_nested_attributes_for :address
accepts_nested_attributes_for :primary_phone
accepts_nested_attributes_for :secondary_phone
accepts_nested_attributes_for :fax
end
居民控制器.rb-(构建代码位于“新”方法内)
class ResidentsController < ApplicationController
before_filter :authenticate_admin!
def index
@residents = Resident.all
end
def new
@resident = Resident.new
@resident.build_address
@resident.build_guardian
@resident.build_desrep
@resident.build_em_contact1
@resident.build_em_contact2
end
end
意见/居民/_form.html.erb(这显示了居民的工作地址 fields_for)
<%= f.fields_for :address do |builder| %>
<div class="control-group">
<%= builder.label :street_address, "Address:", class: "control-label" %>
<div class="controls">
<%= builder.text_field :street_address, class: "text_field", placeholder: "Resident's Address" %>
</div>
</div>
<div class="control-group">
<%= builder.label :city, "City:", class: "control-label" %>
<div class="controls">
<%= builder.text_field :city, class: "text_field", placeholder: "Resident's City" %>
</div>
</div>
<div class="control-group">
<%= builder.label :state, "State:", class: "control-label" %>
<div class="controls">
<%= builder.text_field :state, class: "text_field", placeholder: "Resident's State" %>
</div>
</div>
<div class="control-group">
<%= builder.label :zip, "Zip:", class: "control-label" %>
<div class="controls">
<%= builder.text_field :zip, class: "text_field", placeholder: "Resident's Zip Code" %>
</div>
</div>
<% end %>
意见/居民/_form.html.erb(这将医生对象显示为“doc1”,这是不起作用的)
<%= fields_for :doc1 do |doc| %>
<div class="control-group">
<%= doc.label :fname, "Doctor's First Name:", class: "control-label" %>
<div class="controls">
<%= doc.text_field :fname, class: "text_field", placeholder: "Doctor's First Name" %>
</div>
</div>
<div class="control-group">
<%= doc.label :lname, "Doctor's Last Name:", class: "control-label" %>
<div class="controls">
<%= doc.text_field :lname, class: "text_field", placeholder: "Doctor's Last Name" %>
</div>
</div>
<div class="control-group">
<%= doc.label :initials, "Initials:", class: "control-label" %>
<div class="controls">
<%= doc.text_field :initials, class: "text_field", placeholder: "Doctor's Initials" %>
</div>
</div>
<div class="control-group">
<%= doc.label :phone1, "Doctor's Primary Phone:", class: "control-label" %>
<div class="controls">
<%= doc.phone_field :phone1_area_code, placeholder: "Area Code", style: "width: 25%;" %>
<%= doc.phone_field :phone1_number, class: "text_field", placeholder: "i.e. 800-555-1212" %>
</div>
</div>
<div class="control-group">
<%= doc.label :phone2, "Doctor's Secondary Phone:", class: "control-label" %>
<div class="controls">
<%= doc.phone_field :phone2_area_code, placeholder: "Area Code", style: "width: 25%;" %>
<%= doc.phone_field :phone2_number, class: "text_field", placeholder: "i.e. 800-555-1212" %>
</div>
</div>
<div class="control-group">
<%= doc.label :fax, "Doctor's Fax:", class: "control-label" %>
<div class="controls">
<%= doc.phone_field :fax_area_code, placeholder: "Area Code", style: "width: 25%;" %>
<%= doc.phone_field :fax_number, class: "text_field", placeholder: "Doctor's Fax Number" %>
</div>
</div>
<div class="control-group">
<%= doc.label :email, "Doctor's Email:", class: "control-label" %>
<div class="controls">
<%= doc.text_field :email, class: "text_field", placeholder: "Doctor's Email Address" %>
</div>
</div>
<div class="control-group">
<%= doc.label :street_address, "Doctor's Address:", class: "control-label" %>
<div class="controls">
<%= doc.text_field :street_address, class: "text_field", placeholder: "Doctor's Street Address" %>
</div>
</div>
<div class="control-group">
<%= doc.label :city, "Doctor's City:", class: "control-label" %>
<div class="controls">
<%= doc.text_field :city, class: "text_field", placeholder: "Doctor's City" %>
</div>
</div>
<div class="control-group">
<%= doc.label :state, "Doctor's State:", class: "control-label" %>
<div class="controls">
<%= doc.text_field :state, class: "text_field", placeholder: "Doctor's State" %>
</div>
</div>
<div class="control-group">
<%= doc.label :zip, "Doctor's Zip:", class: "control-label" %>
<div class="controls">
<%= doc.text_field :zip, class: "text_field", placeholder: "Doctor's Zip Code" %>
</div>
</div>
<% end %>
在使用accepts_nested_attributes之前,我想简单地延迟加载我的对象或通过初始化程序传递它们。但我首先必须做更多的阅读,因为到目前为止我无法使用这些技术获得我想要的结果。
我可以根据要求显示剩余的视图代码和任何其他文件。
提前致谢。
Update:05-25-14 - 我仍在努力解决这个问题,并已经写了这篇博文 http://projectramon.wordpress.com/2014/05/27/exploring-rails-accepts_nested_attributes_for-pt1/根据我的理解,我目前所处的位置。