вложенные атрибуты с полиморфной моделью has_one - PullRequest
3 голосов
/ 29 апреля 2010

Я использую acceptpts_nested_attributes_for с полиморфной моделью has_one в рельсах. 2.3.5 Ниже приведены модели и их ассоциации:

class Address < ActiveRecord::Base
  attr_accessible :city, :address1, :address2
  belongs_to :addressable, :polymorphic => true
  validates_presence_of :address1, :address2, :city
end

class Vendor < ActiveRecord::Base
  attr_accessible :name, :address_attributes
  has_one  :address, :as => :addressable, :dependent => :destroy
  accepts_nested_attributes_for :address
end

Это вид:

- form_for @vendor do |f|
  = f.error_messages
  %p
    = f.label :name
    %br
    = f.text_field :name
  - f.fields_for :address_attributes do |address|
    = render "shared/address_fields", :f => address
  %p
    = f.submit "Create"

Это частичный общий / address_fields.html.haml

%p
  = f.label :city
  %br= f.text_field :city
  %span City/Town name like Dharan, Butwal, Kathmandu, ..
%p
  = f.label :address1
  %br= f.text_field :address1
  %span City Street name like Lazimpat, New Road, ..
%p
  = f.label :address2
  %br= f.text_field :address2
  %span Tole, Marg, Chowk name like Pokhrel Tole, Shanti Marg, Pako, ..

А это контроллер: Класс VendorsController

  def new
    @vendor = Vendor.new
  end

  def create
    @vendor = Vendor.new(params[:vendor])
    if @vendor.save
      flash[:notice] = "Vendor created successfully!"
      redirect_to @vendor
    else
      render :action => 'new'
    end
  end
end

Проблема в том, что когда я заполняю все поля, запись сохраняется в обеих таблицах, как и ожидалось.

Но когда я просто указал имя и город или адрес1, проверка работает, отображается сообщение об ошибке, но значение, введенное в город или адрес1, не сохраняется или не отображается в полях формы адреса?

То же самое относится и к действию редактирования.

Хотя запись сохранена, адрес не отображается в форме редактирования. Отображается только название модели клиента. На самом деле, когда я просматриваю журнал, адресная модель SQL даже не запрашивается.

1 Ответ

1 голос
/ 29 апреля 2010

Почему f.fields_for :address_attributes?

Не должно ли быть:

- f.fields_for :address do |address_fields|
  = render "shared/address_fields", :f => address_fields

Это не загрузка значений при редактировании и ошибки, потому что вы никогда не загрузите address_attributes со значениями из @vendor.address.

...