Rails 3. Почему моя вложенная запись удаляется при переходе на страницу редактирования? - PullRequest
1 голос
/ 08 марта 2012

Каждая компания должна иметь один CompanyContact. Форма моей компании имеет поля для контактов компании. Когда я обновляю Компанию и добавляю новый контакт компании, он работает нормально, потому что на странице показа компании он показывает новый контакт компании. Но когда я нажимаю ссылку «Изменить», которая приводит меня на страницу «Изменить» (примечание: я даже еще не нажимаю кнопку обновления), в форме «Изменить компанию», где должен находиться контакт компании, ничего не отображается. Поэтому я проверяю логи и контакт компании был удален.

DELETE FROM "company_contacts" WHERE "company_contacts"."id" = ? [["id", 4]]

Я в замешательстве, потому что я не вызывал никакого действия удаления.

----------------------------------------
company.rb
has_one :company_contact, :dependent => :destroy
accepts_nested_attributes_for :company_contact

----------------------------------------
company_contact.rb
belongs_to :company

----------------------------------------
companies_controller.rb
def new
  @company = Company.new
  company_contact = @company.build_company_contact
  respond_to do |format|
    format.html # new.html.erb
    format.json { render json: @company }
  end
end

def edit
  @company = Company.find(params[:id])
  company_contact = @company.build_company_contact
end

Ответы [ 2 ]

2 голосов
/ 09 марта 2012

В своем действии редактирования вы создаете контакт компании для своей компании, но у вашей компании есть только один контакт компании. Проверьте наличие, прежде чем строить новый:

company_contact = @company.company_contact || @company.build_company_contact
1 голос
/ 09 марта 2012

Я нашел это в источнике ActiveRecord, что подтверждает подозрение, которое я прокомментировал выше (комментарии в коде ниже мои):

class HasOneAssociation < SingularAssociation #:nodoc:
  def replace(record, save = true)
    raise_on_type_mismatch(record) if record
    load_target

    reflection.klass.transaction do
      # !!!
      # This is where your record is getting deleted
      # !!!
      if target && target != record
        remove_target!(options[:dependent]) unless target.destroyed?
      end

      if record
        set_owner_attributes(record)
        set_inverse_instance(record)

        if owner.persisted? && save && !record.save
          nullify_owner_attributes(record)
          set_owner_attributes(target) if target
          raise RecordNotSaved, "Failed to save the new associated #{reflection.name}."
        end
      end
    end

    self.target = record
  end
...

Этот replace метод, кажется, вызывается всякий раз, когда record.build_association используется.

Ваше действие edit не должно создавать связанную запись, если она уже существует.

...