Проверка пользовательских Rails не может ссылаться на связанный объект - PullRequest
0 голосов
/ 31 января 2012

У меня есть две модели Customer и Referal.Оба имеют атрибут электронной почты.Реферал принадлежит Заказчику, а Заказчик has_many Рефералов.

Когда я создаю / обновляю Реферала, я хочу проверить, что электронная почта на Реферале не совпадает с электронной почтой на объекте Клиента (родителя).

Вотмой реферальный объект: (вырезать ненужные вещи)

class Referal < ActiveRecord::Base
  belongs_to :user
  belongs_to :customer

  validates :name, :presence => true
  validates :email, :presence => true
  validates_format_of :email, :with => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i, :on => :create
  validate :email_cannot_equal_referers

  def email_cannot_equal_referers
    if email == customer.email
      errors.add(:email, "can't be the same as referer's")
    end
  end
end

Вот клиент:

class Customer < ActiveRecord::Base
  has_many :referals 
  validates_presence_of :name, :email
  validates_format_of :email, :with => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i, :allow_blank => true
end

Когда я пытаюсь сохранить реферала, я получаю "неопределенный метод` email 'для nil: NilClass ", который относится к customer.email, как это работает, когда я помещаю электронную почту == email.На данный момент Referal еще не записан в базу данных, хотя customer_id, кажется, установлен, как я могу использовать его в сообщении об ошибке (с .to_s), но он также не работает, чтобы использовать это для поиска объекта Customer с помощьюCustomer.find (customer_id).(Невозможно найти клиента без идентификатора)

Для полноты здесь приведен бит контроллера, который вызывает метод сохранения на Referal:

@refer=Referal.new
@refer.name=params[:Name2]
@refer.email=params[:Email2]
@refer.message=params[:Message]
@customer.referals << @refer
if @refer.save
  CustomerMailer.refer(@refer).deliver
  CustomerMailer.refer_thanks(@refer).deliver
else
  render 'new_refer'
end

Был бы очень признателен за указатели для этой работы!Спасибо

1 Ответ

0 голосов
/ 31 января 2012

Если клиент уже существует в БД, ваша проверка должна работать.

Если вы пытаетесь создать клиента и рефералов одновременно, я бы использовал метод accepts_nested_attributes_for через модель клиента. Я думаю, что вам, возможно, придется добавить проверку в модель клиента, которая перебирает рефералов.

class Customer < ActiveRecord::Base
    has_many :referals
    accepts_nested_attributes_for :referals
end

тогда в вашем контроллере

@customer.referals << @refer
if @customer.save
   @customer.referals.each do |r|
      CustomerMailer.refer(r).deliver
      CustomerMailer.refer_thanks(r).deliver
   end
 end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...