콜백이 전화를 걸고 있습니다...

10708 단어
Flatiron에 대한 두 번째 블로그를 작성하면서 몇 가지 웜홀을 찾았습니다. 나쁘지 않았습니다! Ruby on Rails를 배우는 동안 유효성 검사와 이를 사용하는 방법/시기에 대해 알게 되었습니다. 유효성 검사는 유효한 데이터만 데이터베이스에 저장되도록 하는 데 사용됩니다. 정보를 처리하는 안전한 방법인 것 같습니다. 유효성 검사가 호출되기 전이나 후에 콜백이 호출됩니다. 이러한 작업은 빠르게 발생하며 마법으로 간주됩니다.

-콜백은 개체의 수명 주기 중 특정 순간에 호출되는 메서드입니다. 이를 통해 ActiveRecord 객체가 데이터베이스에서 생성, 저장, 업데이트, 삭제, 유효성 검사 또는 로드될 때마다 실행되는 코드를 작성할 수 있습니다. - Ruby on Rails 가이드



레일 c에서,

run    ActiveRecord::Callbacks::CALLBACKS



=> [:after_initialize, :after_find, :after_touch,
 :before_validation, :after_validation, :before_save,
 :around_save, :after_save, :before_create, :around_create,
 :after_create, :before_update, :around_update, :after_update,
 :before_destroy, :around_destroy, :after_destroy, 
:after_commit, :after_rollback]


사용 가능한 콜백 목록입니다.

콜백을 사용하려면 콜백을 등록해야 합니다. 즉, 올바른 방법을 사용하여 모델에 추가해야 합니다. 다음 네 가지 방법으로 이 작업을 수행할 수 있습니다.
  • 메서드 참조(기호) - 권장
  • 콜백 객체 - 권장됨
  • 인라인 메서드(프로시저 사용) - 적절한 경우
  • 인라인 평가 방법(문자열 사용) - 더 이상 사용되지 않음

  • 다음은 사용 방법에 대한 몇 가지 예입니다. 이 코드 예제는 ActiveRecords 가이드 페이지에서 가져온 것입니다.
    http://guides.rubyonrails.org/active_record_callbacks.html

    class User < ApplicationRecord
      validates :login, :email, presence: true
    
      before_validation :ensure_login_has_a_value
    
      private
        def ensure_login_has_a_value
          if login.nil?
            self.login = email unless email.blank?
          end
        end
    end
    


    이 콜백 before_validation은 사용자가 validates 메소드를 실행하기 전에 유효한 로그인을 가지고 있는지 확인합니다. User 클래스의 private 섹션에 작성한 ensure_login_has_a_value 메서드를 호출합니다. 여기 모델에서 모든 일이 발생합니다.

    블록을 전달할 수 있습니다(짧은 한 줄 논리에 유용함).

    class User < ApplicationRecord
      validates :login, :email, presence: true
    
      before_create do
        self.name = login.capitalize if name.blank?
      end
    end
    


    특정 수명 주기 이벤트에서만 실행되도록 콜백을 등록할 수도 있습니다.

           class User < ApplicationRecord
              before_validation :normalize_name, on: :create
    
            # :on takes an array as well
              after_validation :set_location, on: [ :create, 
              :update ]
    
         private
             def normalize_name
               self.name = name.downcase.titleize
              end
            def set_location
               self.location = LocationService.query(self)
              end
           end 
    


    여기서 before_validation은 :create에서 normalize_name 메서드를 호출합니다. 사용자 이름이 소문자이고 제목이 있는지 확인합니다. after_validation은 [ :create, :update ]에서 set_location 메서드를 호출합니다.

    관계형 콜백:

          class User < ApplicationRecord
            has_many :articles, dependent: :destroy
          end
    
          class Article < ApplicationRecord
            after_destroy :log_destroy_action
    
          def log_destroy_action
            puts 'Article destroyed'
           end
         end
    irb>
    user = User.first
    => #<User id: 1>
    irb>
    user.articles.create!
    => #<Article id: 1, user_id: 1>
    irb>
    user.destroy
    Article destroyed
    => #<User id: 1>
    


    여기서 사용자는 많은 계정을 가지고 있으며 계정을 삭제할 때 종속: :destroy를 사용하여 모든 기사도 삭제해야 합니다.

    콜백 매크로로 콜백을 등록하는 또 다른 예는 상속 가능하다는 것입니다.

         class Sweet < ApplicationRecord
           before_save :do_something_with_sweet
         end
    



         class Vendor < ApplicationRecord
           before_save :do_something_with_vendor
         end
    


    여기서 save 메소드가 Vendor 인스턴스에서 호출되면 :do_something_with_sweet 및 :do_something_with_vendor가 모두 트리거됩니다.

        class Comment < ApplicationRecord
         after_create :send_email_to_author, if: 
          :author_wants_emails?,
         unless: Proc.new { |comment| 
           comment.article.ignore_comments? }
        end
    


    여기서 after_create는 author_wants_emails인 경우_email_to_author를 보냅니다.
    (Proc가 모든 댓글을 철저히 반복하고 있음) 댓글이 있는 사람들은 이메일을 받지 못할 것입니다.

    다음 메서드를 사용하여 콜백을 건너뛸 수 있습니다. http://guides.rubyonrails.org/active_record_callbacks.html
  • 감소!
  • 감소 카운터
  • 삭제
  • 삭제_모두
  • 삭제_비
  • 증분!
  • 증가 카운터
  • 인서트
  • 삽입!
  • 삽입_모두
  • 모두 삽입!
  • 터치_올
  • 업데이트_열
  • 업데이트 열
  • 업데이트_모두
  • 업데이트 카운터
  • 업서트
  • upsert_all



  • 결론적으로 콜백을 사용하는 재미있는 방법은 매우 다양합니다. 그들은 마술적이며 아껴서 사용해야 합니다. 너무 많이 사용하면 문제가 되고 탐색하기 어려울 수 있습니다. 도움이 되었기를 바랍니다.

    좋은 웹페이지 즐겨찾기