У меня есть следующая структура объекта для хранения некоторых данных. ApplicationFrom имеет три атрибута, которые являются объектами. Я расширяю ActiveModel, чтобы позже добавить проверки. подробности можно найти здесь - rails_casts
module PipedriveApplicationForm
class ApplicationForm
include ActiveModel::Validations
include ActiveModel::Conversion
extend ActiveModel::Naming
attr_accessor :org_details, :contact_details, :deal_details
def initialize(attributes = {})
attributes.each do |name, value|
begin
send("#{name}=", value)
rescue => exception
end
end
end
end
class OrgDetail
include ActiveModel::Validations
include ActiveModel::Conversion
extend ActiveModel::Naming
attr_accessor :businessDescription,
:businessWebsite,
def initialize(attributes = {})
attributes.each do |name, value|
begin
send("#{name}=", value)
rescue => exception
end
end
end
end
class ContactDetail
include ActiveModel::Validations
include ActiveModel::Conversion
extend ActiveModel::Naming
attr_accessor :ownerDOB
def initialize(attributes = {})
attributes.each do |name, value|
begin
send("#{name}=", value)
rescue => exception
end
end
end
end
class DealDetail
include ActiveModel::Validations
include ActiveModel::Conversion
extend ActiveModel::Naming
attr_accessor :purpose
def initialize(attributes = {})
attributes.each do |name, value|
begin
send("#{name}=", value)
rescue => exception
end
end
end
end
end
В моем контроллере я строю следующий объект
def edit_application
@application_details = PipedriveApplicationForm::DealDetail.new(application_detail)
@person_details = PipedriveApplicationForm::ContactDetail.new(get_person_by_id(application_detail['data']['person_id']['value'])[:data])
@org_details = PipedriveApplicationForm::OrgDetail.new(get_org_by_id(application_detail['data']['org_id']['value'])[:data])
@pipedrive_application = PipedriveApplicationForm::ApplicationForm.new({org_details: @org_details, contact_details: @person_details, deal_details: @application_details})
end
Теперь в своей форме я делаю это Я использование fields_for для доступа к вложенному объекту и попытки его обновления.
= form_for(@pipedrive_application, url: edit_application_path(current_user, @application), html: {method: :put}) do |f|
= f.object.inspect
= f.fields_for :deal_details do |ff|
= ff.object.inspect
%h4
Application Details
=ff.label :purpose
=ff.text_field :purpose
Значения полей не заполняются предварительно. В чем проблема?