0

У меня есть модель Printer, к которой я добавил булевский столбец master. Принтер belongs_to :restaurant. Флаг master указал, является ли этот принтер основным принтером этого ресторана.rails callback before_create broken after_validate works

У меня есть метод в модели принтера:

def set_master_on_create 
    if self.restaurant.printers.empty? 
    self[:master] = true 
    else 
    self[:master] = false 
    end 
end 

и установить эту функцию обратного вызова: before_create :set_master_on_create

Если я запускаю этот метод как before_create затем создать новый принтер не будет выполнена. Если я изменю обратный вызов на after_validation, создание нового объекта будет безупречно работать, даже с опцией :on => :create.

Удаляет ли Rails объект, поэтому я не могу больше изменять значения после определенной точки, что приведет к появлению Rollback? Любая помощь оценивается.

Я нахожусь на Rails 3.2.2 и sqlite в режиме dev.

ответ

1

Я думаю, проблема в том, что метод before_create, возвращающий false, не позволит вашему объекту быть сохраненным. попробуйте добавить return true

и я предполагаю, что вы установили атрибут мастера, как это: self.master = true

def set_master_on_create 
    if self.restaurant.printers.empty? 
    self.master = true 
    else 
    self.master = false 
    end 

    return true 
end 

Если before_ * обратный вызов отменяет действие выдаются ROLLBACK. Вы, , также можете запускать ROLLBACK, создавая исключение в любом из обратных вызовов , в том числе после_ * перехватчиков. Обратите внимание, однако, что в этом случае клиент должен знать об этом, потому что обычное сохранение поднимет такое исключение, вместо того, чтобы спокойно возвращать false. http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html

+0

ничего себе. это было быстро, и это работает. ты жжешь!! большое спасибо :) – patrickdet