Ограничить при добавлении элемента в коллекцию has_many - PullRequest
0 голосов
/ 06 февраля 2012

Согласно руководству по rails, появление исключения в блоке before_add для многих будет препятствовать добавлению объекта в коллекцию. Но, однако, исключение не обрабатывается active_record.

class Order < ActiveRecord::Base
  belongs_to :customer
end

class Customer < ActiveRecord::Base
  has_many :orders, :before_add => :check_credit_limit

  def check_credit_limit(order)
     #If a before_add callback throws an exception, the object does not get added to the collection. 
     raise 'Value cannot be greater than 450' if order.value > 450
  end
end

Failure/Error: customer.orders << order
value cannot be greater than 450

Как я могу справиться с этим изящно?

1 Ответ

0 голосов
/ 06 февраля 2012

Вы можете добавить проверку на класс заказа:

class Order < ActiveRecord::Base
  validate :check_value_limit

  def check_value_limit
    errors.add(:value, "can not be greater than 450") if value > 450
  end
end

ИЛИ в качестве примера для комментария Марка, приведенного выше, вам придется добавить ошибку в ваш объект и обработать исключение вручную. Это базовый пример обработки при создании.

обновить метод проверки, чтобы добавить ошибку к объекту:

customer.rb

  def check_credit_limit(order)
     #If a before_add callback throws an exception, the object does not get added to the collection.
     if order.value > 450
       errors.add(:base, "Value can not be greater than 450")
       raise 'Value cannot be greater than 450'
     end 
  end

пример обработки исключения при создании в вашем контроллере:

def create
  @customer.new(params[:customer])
  if @customer.save
    …
  else
   render :action=>"new"
  end
rescue
  render :action=>"new"
end

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

...