2012-03-30 2 views
2

레코드가 업데이트되기 전에 유효성 검사를 실행하고 싶습니다. 나는 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 
+0

일반 실행 응용 프로그램에서와 동일한 동작입니다. – mober

+0

어쩌면 나는 뭔가를 놓치고있다. 그러나'(: on => : update)'를 before_save에 전달하는 것에 관한 문서에서 아무것도 보이지 않고 왜'before_update'를 사용하지 않는가? –

+0

앞에서 언급했듯이 'before_update'가 있다는 것을 알고 있습니다.하지만 정확히 필요한 경우 문서를 열어 두었습니다. 작동하지 않았습니다. ': on'은 안내서의 유효성 검사를 위해 설명되어 있습니다. -> http://edgeguides.rubyonrails.org/active_record_validations_callbacks.html#on 콜백은 바로 뒤에 오며, 문서는': on' 패턴을 다시 언급합니다. 그래서 문자열을 뽑았습니다 ... – mober

답변

3

액티브 :: 콜백이 suppo하지 pivotallabs에서이 가장 우수한 기사를 확인,이 레일은 콜백을 실행하는 순서입니다 사용하는 가장 큰 이유 같은데 rt an :on 옵션 ...

:on 옵션을 처리하는 유일한 곳은 레일스 코드베이스 ActiveModel::Validations의 유효성 검사 모듈 코드입니다.

ActiveRecord::Callbacks 코드를 살펴 본다면 :on에 대한 언급이 없으며 ActiveRecord :: Callbacks 모듈에 해당 옵션을 처리 할 ActiveModel :: Validations 모듈이 포함되어 있지 않음을 알 수 있습니다.ActiveModel :: Validations :: Callbacks에 대한 포함이 있지만 이는 before_after_ 유효성 검증 메소드에 대한 정의를 제공합니다. 그러나 before_validationafter_validation 콜백은 정의에 here으로 표시된 :on 옵션을 처리합니다.

0

레일스 API가 버전간에 변경된 부분 중 하나라고 확신합니다. 나는 after_initialize 메서드를 정의해야 할 때 (콜백으로 사용할 수 없었 음) 리콜 할 때와 마찬가지로 before_save에 대한 옵션으로 :on을 전달하는 방법이 있다는 것을 기억합니다.

현재의 방법은보다 명확하고 명확합니다.

현재 문서는, 포크, 변경 및 이 문서에 변경 (NO 풀 요청에 필요한, 또는 가능) 포함 할 커밋 수있는 새로운 docrails Github의 저장소를 체크 아웃, before_save(:on => :update)를 참조 찾을 경우.

before_save :run_this_before_update, :on => :update 

def run_this_before_update 
    puts "******** before_save on => :update ********" 
    # do something 
end 
: 좀 더 연구 한 후
+0

링크의 고주파. 나는 그것을 조사 할 것이다. – mober

0

, 당신이 옳은 것처럼 당신이 before_save

어쩌면 문제는 블록 표기법에서 오는에 :on => :update을 전달할 수있는 것처럼, 그것은이 같은 함수를 호출하려고 보이는 모습

http://pivotallabs.com/users/danny/blog/articles/1767-activerecord-callbacks-autosave-before-this-and-that-etc-

+0

방금 ​​함수 호출로 변경했습니다. 같은 결과. 콜백은 create시에 실행됩니다. 링크를위한 고맙습니다. 나는 가서 확인해. – mober

+0

방금 ​​언급 한 블로그 포스트에서 돌아 왔고 거기에서 그가하고있는 일에 대해 잘못된 것이 있습니다 ... 그의 관계는 자신의 current_model이 belongs_to : credit_card이고 콜백이 before_create : build_credit_card입니다. 이것은 자식 객체'current_model'는 콜백에 부모를 만듭니다 ... 가장 틀린 것은 틀린 것입니다. foreign_key 제약 조건도 잘못되어 관계의 끝이 호출되고 물건을 가져 오는 순서가 엉망이됩니다. – mober

+0

@mober, 블로그 게시물 : 콜백에 신용 카드를 먼저 저장하고 현재 모델에 할당하면 'belongs_to' 관계가 해당 관계를 자동 저장합니다. 그럼, 그걸 구축하는 올바른 방법이야. – kafuchau

관련 문제