Я хочу запустить проверку перед обновлением записи. Я знаю о before_update
, но я в значительной степени скопировал и вставил первый кодовый код из документации API.
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 => "test@test.com").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", "test@test.com"], ["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 => "test@test.com").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", "test@test.com"], ["first_name", nil], ["last_name", nil], ["updated_at", Fri, 30 Mar 2012 02:28:45 UTC +00:00]]
(131.2ms) commit transaction
=> true