Я хочу, чтобы проверка выполнялась до того, как запись будет обновлена. Я знаю before_update
, но я в значительной степени копировал и вставлял первые коды из api docs.Почему этот обратный вызов выполнен?
http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html
Моя урезанная модель выглядела тогда как
class User < ActiveRecord::Base
attr_accessible :email
validates :email, :presence => true
before_save(:on => :update) do
puts "******** before_save on => :update ********"
# do something
end
end
, если я иду в консоль и сделать создать запись новый этот обратный вызов запущенную на вызов SQL вставки.
irb(main):001:0> User.new(:email => "[email protected]").save
(0.1ms) begin transaction
******** before_save on => :update ********
SQL (29.1ms) INSERT INTO "users" ("created_at", "email", "first_name", "last_name", "updated_at") VALUES (?, ?, ?, ?, ?) [["created_at", Fri, 30 Mar 2012 00:26:33 UTC +00:00], ["email", "[email protected]"], ["first_name", nil], ["last_name", nil], ["updated_at", Fri, 30 Mar 2012 00:26:33 UTC +00:00]]
(433.1ms) commit transaction
=> true
irb(main):002:0>
Я бы ожидал увидеть это только при вызове обновления. Может ли кто-нибудь осветить это?
[EDIT]
Я только что изменил функцию обратного вызова в вызов функции без изменения результата. Обратный вызов по-прежнему выполняется при создании.
class User < ActiveRecord::Base
attr_accessible :email
validates :email, :presence => true
before_save :my_before_update, :on => :update
private
def my_before_update
puts "******** before_save on => :update ********"
# do something
end
конец
Выходной сигнал такой же.
Loading development environment (Rails 3.2.2)
irb(main):001:0> User.new(:email => "[email protected]").save
(0.1ms) begin transaction
******** before_save on => :update ********
SQL (28.2ms) INSERT INTO "users" ("created_at", "email", "first_name", "last_name", "updated_at") VALUES (?, ?, ?, ?, ?) [["created_at", Fri, 30 Mar 2012 02:28:45 UTC +00:00], ["email", "[email protected]"], ["first_name", nil], ["last_name", nil], ["updated_at", Fri, 30 Mar 2012 02:28:45 UTC +00:00]]
(131.2ms) commit transaction
=> true
Такое же поведение в обычном запуске приложения. – mober
Возможно, я что-то пропустил, но ничего не вижу в документах о передаче '(: on =>: update)' before_save и почему бы не использовать 'before_update'? –
Как я упоминал ранее, я знаю, что есть 'before_update', но сегодня случилось, что у меня открылись документы, когда мне это было нужно, и это не сработало. ': on' объясняется для валидаций в руководствах -> http://edgeguides.rubyonrails.org/active_record_validations_callbacks.html#, когда обратные вызовы поступают сразу после него, и в документах снова упоминается шаблон': on'. Поэтому я вытащил строки ... – mober