레코드가 업데이트되기 전에 유효성 검사를 실행하고 싶습니다. 나는 before_update
을 알고 있지만, 나는 꽤 많이 복사하여 api 문서에서 첫 번째 코드 닛을 붙여 넣었다. 내가 콘솔로 가서이 콜백은 SQL 삽입 전화에서 실행되고있는 새로운 항목을 작성하는 경우에이 콜백이 실행되는 이유는 무엇입니까?
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
같이 다음 보였다.
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>
업데이트 요청시에만 표시됩니다. 아무도 이걸 좀 밝힐 수 있니?
I 단지 결과에 변화가없는 함수 호출로 콜백을 변경
[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 콜백은 바로 뒤에 오며, 문서는': on' 패턴을 다시 언급합니다. 그래서 문자열을 뽑았습니다 ... – mober