[RUBY-ON-RAILS] 레일의 파괴에 I '검증'을 어떻게
RUBY-ON-RAILS레일의 파괴에 I '검증'을 어떻게
편안한 자원의 파괴에, 나는 내가 계속 작업을 파괴 할 수 전에 몇 가지를 보장하려면? 기본적으로, 내가 이렇게하는 것은 잘못된 상태에서 데이터베이스를 배치 할 점에 유의하면 작업을 파괴 중지 할 수있는 기능을 원하는? 파괴를 작업에 대한 유효성 검사 콜백은 어떻게 하나 "유효성 검사"여부를 파괴 작업을 허용해야 않으며, 없다?
해결법
-
==============================
1.당신은 당신이 다음 잡을 예외를 발생시킬 수 있습니다. 문제를하는 데 도움이 거래에 랩을 삭제 레일.
당신은 당신이 다음 잡을 예외를 발생시킬 수 있습니다. 문제를하는 데 도움이 거래에 랩을 삭제 레일.
예를 들면 :
class Booking < ActiveRecord::Base has_many :booking_payments .... def destroy raise "Cannot delete booking with payments" unless booking_payments.count == 0 # ... ok, go ahead and destroy super end end
또는 당신은 before_destroy 콜백을 사용할 수 있습니다. 이 콜백은 일반적으로 의존 기록을 파괴하는 데 사용됩니다,하지만 당신은 예외를 던지거나 대신 오류를 추가 할 수 있습니다.
def before_destroy return true if booking_payments.count == 0 errors.add :base, "Cannot delete booking with payments" # or errors.add_to_base in Rails 2 false # Rails 5 throw(:abort) end
myBooking.destroy 지금 false를 반환하며, myBooking.errors은 반환에 채워집니다.
-
==============================
2.단지 참고 사항 :
단지 참고 사항 :
레일 3
class Booking < ActiveRecord::Base before_destroy :booking_with_payments? private def booking_with_payments? errors.add(:base, "Cannot delete booking with payments") unless booking_payments.count == 0 errors.blank? #return false, to not destroy the element, otherwise, it will delete. end
-
==============================
3.내가 레일 (5)와 함께했던 것입니다 :
내가 레일 (5)와 함께했던 것입니다 :
before_destroy do cannot_delete_with_qrcodes throw(:abort) if errors.present? end def cannot_delete_with_qrcodes errors.add(:base, 'Cannot delete shop with qrcodes') if qrcodes.any? end
-
==============================
4.액티브 협회의 has_many와 has_one 확실히 관련 테이블 행이 삭제에서 삭제하는 것 종속 옵션을 허용하지만, 이것은 잘못되는 것을 방지하기보다는 깨끗한 데이터베이스를 유지하기 위해 보통이다.
액티브 협회의 has_many와 has_one 확실히 관련 테이블 행이 삭제에서 삭제하는 것 종속 옵션을 허용하지만, 이것은 잘못되는 것을 방지하기보다는 깨끗한 데이터베이스를 유지하기 위해 보통이다.
-
==============================
5.당신은이에 조치를 파괴 포장 할 수 있습니다 "만약"컨트롤러에 문 :
당신은이에 조치를 파괴 포장 할 수 있습니다 "만약"컨트롤러에 문 :
def destroy # in controller context if (model.valid_destroy?) model.destroy # if in model context, use `super` end end
어디 valid_destroy? 기록을 파괴하기위한 조건이 충족되는 경우 true를 반환 모델 클래스의 방법이다.
사용자가 잘못된 연산을 수행 할 수 없습니다로 사용자 경험을 향상시킬 것 - 이런 방법을 갖는 것은 또한 사용자에게 삭제 옵션의 표시를 방지 할 수있게된다.
-
==============================
6.나는 액티브에 can_destroy 재정의를 만들려면 여기에서 코드를 사용하여 결국 : https://gist.github.com/andhapp/1761098
나는 액티브에 can_destroy 재정의를 만들려면 여기에서 코드를 사용하여 결국 : https://gist.github.com/andhapp/1761098
class ActiveRecord::Base def can_destroy? self.class.reflect_on_all_associations.all? do |assoc| assoc.options[:dependent] != :restrict || (assoc.macro == :has_one && self.send(assoc.name).nil?) || (assoc.macro == :has_many && self.send(assoc.name).empty?) end end end
이 / 인터페이스에 삭제 버튼을 숨기려면 사소한 만들기의 추가 혜택을 보여왔다
-
==============================
7.당신은 또한 예외를 발생하는 before_destroy 콜백을 사용할 수 있습니다.
당신은 또한 예외를 발생하는 before_destroy 콜백을 사용할 수 있습니다.
-
==============================
8.나는이 클래스 나 모델을 가지고
나는이 클래스 나 모델을 가지고
class Enterprise < AR::Base has_many :products before_destroy :enterprise_with_products? private def empresas_with_portafolios? self.portafolios.empty? end end class Product < AR::Base belongs_to :enterprises end
당신이 기업을 삭제할 때 기업과 관련된 제품이있는 경우 이제이 과정은 유효성을 검사 참고 : 먼저 확인하기 위해 클래스의 상단에이를 작성해야합니다.
-
==============================
9.레일 5에서 사용 액티브 컨텍스트 확인.
레일 5에서 사용 액티브 컨텍스트 확인.
class ApplicationRecord < ActiveRecord::Base before_destroy do throw :abort if invalid?(:destroy) end end
class Ticket < ApplicationRecord validate :validate_expires_on, on: :destroy def validate_expires_on errors.add :expires_on if expires_on > Time.now end end
-
==============================
10.나는 내가 레일이 추가 얻을 발행 열 수 있도록이 지원 될 것이라고 기대했다 :
나는 내가 레일이 추가 얻을 발행 열 수 있도록이 지원 될 것이라고 기대했다 :
https://github.com/rails/rails/issues/32376
-
==============================
11.레일 6 등 업무의 주 :
레일 6 등 업무의 주 :
이 작품 :
before_destroy :ensure_something, prepend: true do throw(:abort) if errors.present? end private def ensure_something errors.add(:field, "This isn't a good idea..") if something_bad end
유효성 검사 : validate_test에 : 파괴하지 작업을 수행합니다 https://github.com/rails/rails/issues/32376
레일 5 던져 때문에 https://makandracards.com/makandra/20301-cancelling-the-activerecord-callback-chain : (: 중단) 실행을 취소해야합니다
앞에 추가 : 사실 그렇게 필요하다고 의존 : 유효성 검증이 실행되기 전에 실행되지 않습니다 멸 https://github.com/rails/rails/issues/3458
당신은 다른 답변과 의견에서이 함께 물고기 수 있지만이 완료 될 그들 중 누구도 결과가 없습니다.
(!) 참고로, 많은 사람들이이 분리 된 레코드를 생성 할 경우 모든 레코드를 삭제하지 않도록주의 할 예로서 has_many 관계를 사용했다. 이 훨씬 더 쉽게 해결 될 수있다 :
has_many : 기관, 의존 : restrict_with_error
from https://stackoverflow.com/questions/123078/how-do-i-validate-on-destroy-in-rails by cc-by-sa and MIT license
'RUBY-ON-RAILS' 카테고리의 다른 글
[RUBY-ON-RAILS] 레일 원숭이 패치 3 (0) | 2020.02.12 |
---|---|
[RUBY-ON-RAILS] 어떻게 레일에 사용 SSL에에 WEBrick을 구성해야합니까? (0) | 2020.02.12 |
[RUBY-ON-RAILS] 레일 - 사용 유형 열을 STI없이? (0) | 2020.02.12 |
[RUBY-ON-RAILS] 랙에 :: 세션 : 쿠키 경고를 제공하는 비밀 옵션 없다? (0) | 2020.02.12 |
[RUBY-ON-RAILS] OpenSSL을 :: SSL에게 Heroku에 :: SSLError [중복] (0) | 2020.02.12 |