레일에서 읽기 전용 속성을 만드는 더 좋은 방법이 있습니까?

MaxGabriel

읽기 전용 속성을 갖고 싶은 Rails에서 ActiveRecord 객체를 생성하고 있습니다. 나는 처음에 사용을 시도 attr_readonly했지만 그것을 발견하고 실망했습니다.

  1. 새 레코드에서도 해당 속성의 대량 업데이트 비활성화
  2. 레코드가 저장된 경우 예외를 발생시키지 않았거나 어떤 식 으로든 읽기 전용 속성이 변경되었음을 알리지 않았습니다.

이 두 기능을 모두 원합니다. 이것은 구현에 대한 나의 시도입니다.

# For use with ActiveRecord

module ReadOnlyAttributes

  class ReadOnlyAttributeException < StandardError
  end

  def create_or_update # Private, but its what every method gets funneled through.
    if !self.new_record? && self.respond_to?(:read_only_attributes)
      changed_symbols = self.changed.map(&:to_sym)
      if changed_symbols.intersect?(self.read_only_attributes)
        raise ReadOnlyAttributeException, "Readonly attributes modified on #{self.class}: #{changed_symbols & self.read_only_attributes}"
      end
    end

    super
  end

end

그리고 내 모델에서 :

class Model < ActiveRecord::Base

  include ReadOnlyAttributes

  def read_only_attributes
    [:event_type]
  end

end

위의 요구 사항을 충족하는 읽기 전용 속성을 가져 오는 기본 제공 또는 더 나은 방법이 있습니까?

나는 여전히 Ruby / Rails를 처음 접하기 때문에 어떤 스타일 주석도 고맙게 생각합니다.

최대

이것을 시도해 보셨습니까?

class Model < ActiveRecord::Base    
  before_save :protect_attributes

  private
  def protect_attributes
     false if !new_record? && event_type_changed?
  end
end

또 다른 생각은, 왜 이것을 모델 수준에서 시행해야할까요? 읽기 전용 속성과 컨트롤러의 생성 작업에서만 쓸 수있는 속성의 차이점은 무엇입니까? 항상 다음과 같이 할 수 있습니다.

class EventController < ActionController::Base
  def create
    @event = Event.new params.require(:event).permit :event_name, :event_type
  end

  def update
    @event = Event.find(params[:id]).update params.require(:event).permit(:event_name)
  end
end

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Swift에서 "get"전용 변수를 초기화하는 더 좋은 방법이 있습니까?

이것을 만드는 더 좋은 방법이 있습니까?

파일의 전체 내용을 OutputStream에 쓰는 더 좋은 방법이 있습니까?

Python에서 읽기 전용 클래스 속성을 만드는 방법은 무엇입니까?

bash 스크립트에서 파일을 읽고 추가하는 더 좋은 방법이 있습니까?

Python에서 여러 txt 파일을 읽는 더 좋은 방법이 있습니까?

파이 게임에서 타일 맵을 만드는 더 좋은 방법이 있습니까?

COM에 노출 된 읽기 전용 속성을 만드는 방법은 무엇입니까?

Gradle : 2 개의 구성에 동일한 종속성을 할당하는 더 좋은 방법이 있습니까?

Clojure에서 이 피벗 기능을 작성하는 더 좋은 방법이 있습니까?

touch 및 echo를 사용하는 것보다 bash에서 파일을 만드는 더 좋은 방법이 있습니까?

LinkedHashMap을 채우기 위해 Java 8을 사용하여 작성하는 더 좋은 방법이 있습니까?

플렉스 디스플레이에서 항목 사이에 동일한 간격을 만드는 더 좋은 방법이 있습니까?

Python 속도를 높일 때 cython을 사용하는 더 좋은 방법이 있습니까?

이 기능을 작성하는 더 좋은 방법이 있습니까?

NPM 스크립트를 더 읽기 쉽게 구성하는 더 좋은 방법이 있습니까?

배열에서 객체의 속성을 찾는 더 좋은 방법이 있습니까?

laravel에서 if 문을 작성하는 더 좋은 방법이 있습니까?

Numpy 행렬에서 값을 생성하기 위해 다른 셀을 사용하는 더 좋은 방법이 있습니까?

열린 애니메이션 (확장)을 사용하여 신속하게 회전식보기를 만드는 더 좋은 방법은 무엇입니까?

vb.net에서 읽기 전용 속성을 설정하는 방법이 있습니까?

CountDownLatch를 사용하는 것보다 두 스레드가 작업을 완료 할 때까지 기다리는 더 좋은 방법이 있습니까?

이것을 작성하는 더 좋은 방법이 있습니까? 여러 폴더에서 파일 삭제

데이터 프레임을 완성하기 위해 NESTING 함수를 사용하여 여러 변수를 가져 오는 더 좋은 방법이 있습니까?

SwiftUI에서 사용자 정의 키보드 보기에 데이터를 전달하는 더 좋은 방법이 있습니까?

Python (3.6.2) 파일을 구성하는 더 좋은 방법이 있습니까?

파이썬에서 다른 목록의 사전을 비교하는 더 좋은 방법이 있습니까?

중첩 된 사전의 값 목록을 만드는 더 좋은 방법이 있습니까?

1D 배열에서 2D 배열을 만드는 matplotlib-더 좋은 방법이 있습니까?

TOP 리스트

  1. 1

    Ionic 2 로더가 적시에 표시되지 않음

  2. 2

    JSoup javax.net.ssl.SSLHandshakeException : <url>과 일치하는 주체 대체 DNS 이름이 없습니다.

  3. 3

    std :: regex의 일관성없는 동작

  4. 4

    Xcode10 유효성 검사 : 이미지에 투명성이 없지만 여전히 수락되지 않습니까?

  5. 5

    java.lang.UnsatisfiedLinkError : 지정된 모듈을 찾을 수 없습니다

  6. 6

    rclone으로 원격 디렉토리의 모든 파일을 삭제하는 방법은 무엇입니까?

  7. 7

    상황에 맞는 메뉴 색상

  8. 8

    SMTPException : 전송 연결에서 데이터를 읽을 수 없음 : net_io_connectionclosed

  9. 9

    정점 셰이더에서 카메라에서 개체까지의 XY 거리

  10. 10

    Windows cmd를 통해 Anaconda 환경에서 Python 스크립트 실행

  11. 11

    다음 컨트롤이 추가되었지만 사용할 수 없습니다.

  12. 12

    C #에서 'System.DBNull'형식의 개체를 'System.String'형식으로 캐스팅 할 수 없습니다.

  13. 13

    JNDI를 사용하여 Spring Boot에서 다중 데이터 소스 구성

  14. 14

    Cassandra에서 버전이 지정된 계층의 효율적인 모델링

  15. 15

    복사 / 붙여 넣기 비활성화

  16. 16

    Android Kotlin은 다른 활동에서 함수를 호출합니다.

  17. 17

    Google Play Console에서 '예기치 않은 오류가 발생했습니다. 나중에 다시 시도해주세요. (7100000)'오류를 수정하는 방법은 무엇입니까?

  18. 18

    SQL Server-현명한 데이터 문제 받기

  19. 19

    Seaborn에서 축 제목 숨기기

  20. 20

    ArrayBufferLike의 typescript 정의의 깊은 의미

  21. 21

    Kubernetes Horizontal Pod Autoscaler (HPA) 테스트

뜨겁다태그

보관