Rails ActiveRecord Обновление вопроса - PullRequest
0 голосов
/ 30 декабря 2008

У меня есть модель пользователя, которая имеет несколько адресов. Теперь для моего заявления в рельсах, адрес не является обязательным. Итак, если кто-то хочет создать пользователя и ввести адрес после того, как пользователь был создан, мое приложение должно разрешить это. Моя проблема в том, что для модели адреса у меня есть проверки для адресной строки 1, города и почтового индекса. Эти поля не могут быть пустыми. При редактировании пользователя происходит сбой следующего кода:

user.addresses << Address.new </p>

Rails пытается создать новый адрес и запускает команду вставки. Это потерпит неудачу из-за проверок, требуемых в модели. Приведенный выше код не завершится ошибкой, если пользователь отсутствует в базе данных. Одним из решений этой проблемы является создание отдельной привязки form_for для части редактирования для пользователя. Я не хочу делать это решение. Есть ли какое-либо решение, позволяющее мне связать пустой объект Address с уже существующим объектом User в базе данных?

Ответы [ 2 ]

3 голосов
/ 31 декабря 2008
user.addresses << Address.new

Этот код не будет работать в любом случае, если ваша модель адреса требует, чтобы ее поля были установлены, потому что вы не предоставляете хэш для Address.new

Если вы хотите добавить адрес условно, вы, вероятно, хотите что-то вроде этого:

if !params[:address].blank?
  user.addresses.create(params[:address])
end

или

user.addresses << Address.new(params[:address]) unless params[:address].blank

Если вы действительно хотите создать «пустой» адресный объект для каждого пользователя (вместо того, чтобы просто иметь пользователей без адресов), вы можете изменить проверки, чтобы они запускались только при заполнении полей.

Примерно так:

class Address < ActiveRecord::Base
  validates_presence_of :address1, :if => :non_empty_address?
  # etc

  private
    def non_empty_address?
     !address1.blank? || !address2.blank || !city.blank? # etc
    end
end

Плагин restful_authentication использует аналогичный подход, чтобы определить, требуется ли пароль пользователя.

3 голосов
/ 31 декабря 2008

Зачем пытаться добавить пустой объект Address в коллекцию user.addresses? Я думаю, вы могли бы просто сделать что-то вроде:

user.addresses << Address.new unless (conditions)

К сожалению, я не знаю, какие у вас условия, поэтому это может быть что-то вроде

user.addresses << Address.new unless params[:address].nil?

... хотя я предполагаю, что у вас есть реальный объект Address вместо простого ввода пустого Address.new ...

...