콜백이 전화를 걸고 있습니다...
-콜백은 개체의 수명 주기 중 특정 순간에 호출되는 메서드입니다. 이를 통해 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
결론적으로 콜백을 사용하는 재미있는 방법은 매우 다양합니다. 그들은 마술적이며 아껴서 사용해야 합니다. 너무 많이 사용하면 문제가 되고 탐색하기 어려울 수 있습니다. 도움이 되었기를 바랍니다.
Reference
이 문제에 관하여(콜백이 전화를 걸고 있습니다...), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/rockshells/callbacks-are-calling-3p6n텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)