복붙노트

[RUBY-ON-RAILS] 속성이 변경되었을 경우 3 확인 레일

RUBY-ON-RAILS

속성이 변경되었을 경우 3 확인 레일

속성의 블록이 레일 3 년 갱신하기 전에 변경된 경우 필요는 확인합니다.

street1, street2, 도시, 주, 우편 번호

나는 같은 것을 사용할 수 있습니다 알고

if @user.street1 != params[:user][:street1]
  then do something....
end

그러나 코드의 조각은 정말 긴 될 것입니다. 청소기의 방법이 있습니까?

해결법

  1. ==============================

    1.(기본적으로 모든 모델에서 사용할 수) ActiveModel :: 더러운를 확인하십시오. 문서는 정말 좋은,하지만 당신과 같은 일을 할 수 있습니다 :

    (기본적으로 모든 모델에서 사용할 수) ActiveModel :: 더러운를 확인하십시오. 문서는 정말 좋은,하지만 당신과 같은 일을 할 수 있습니다 :

    @user.street1_changed? # => true/false
    
  2. ==============================

    2.이것은 내가 여러 속성의 변화를 확인하는 문제를 해결하는 방법입니다.

    이것은 내가 여러 속성의 변화를 확인하는 문제를 해결하는 방법입니다.

    attrs = ["street1", "street2", "city", "state", "zipcode"]
    
    if (@user.changed & attrs).any?
      then do something....
    end
    

    변경된 방법은 개체에 대한 변경 속성의 배열을 반환합니다.

    두 @는 user.changed 및 바인드합니다 내가 교차로를 얻을 수 있도록 배열 (워 및 다른 워 방법 참조)이다. 교차의 결과는 배열이다. 하나를 호출하여? 적어도 하나 개의 교차점이있는 경우 배열에, 나는 진정한 얻을.

    도 매우 유용 상기 changed_attributes 방법은 원래의 값의 변화를 반환 (배열) 원래 새로운 값 속성의 속성 해시의 해시를 리턴한다.

    당신은 버전이 이러한 방법을 지원하는 APIDock를 확인할 수 있습니다.

    http://apidock.com/rails/ActiveModel/Dirty

  3. ==============================

    3.에서 @ model.update_attributes는 () 변경 사항을 숨겨 때문에 ActiveModel :: 더러운 나를 위해 작동하지 않았다. 이 그래서 내가 컨트롤러의 업데이트 방법에 변화에게 그것을 감지하는 방법입니다 :

    에서 @ model.update_attributes는 () 변경 사항을 숨겨 때문에 ActiveModel :: 더러운 나를 위해 작동하지 않았다. 이 그래서 내가 컨트롤러의 업데이트 방법에 변화에게 그것을 감지하는 방법입니다 :

    def update
      @model = Model.find(params[:id])
      detect_changes
    
      if @model.update_attributes(params[:model])
        do_stuff if attr_changed?
      end
    end
    
    private
    
    def detect_changes
      @changed = []
      @changed << :attr if @model.attr != params[:model][:attr]
    end
    
    def attr_changed?
      @changed.include :attr
    end
    

    당신이 속성을 많이 감지하려는 경우가 지저분하지만를 얻을 수 변경합니다. 아마 컨트롤러하지만, MEH에서이 작업을 수행해서는 안된다.

  4. ==============================

    4.레일 버전 5.1 콜백

    레일 버전 5.1 콜백

    레일 5.1, 루비의 이름으로 attribute_changed? 및 attribute_was 액티브 방법은 더 이상 사용되지 않습니다

    사용 saved_change_to_attribute? 대신 attribute_changed?

    @user.saved_change_to_street1? # => true/false
    

    여기에 더 많은 예제

  5. ==============================

    5.답변은 지식에 대한 더 나은하지만 아직보다도 우리뿐만 아니라 다른 접근 방식을 가지고, 개체 (@design)에 대해 변경 '종류'항목의 값하자

    답변은 지식에 대한 더 나은하지만 아직보다도 우리뿐만 아니라 다른 접근 방식을 가지고, 개체 (@design)에 대해 변경 '종류'항목의 값하자

    @design.changes.has_key?('catagory')
    

    .CHANGES 각 열의 두 값 [OLD_VALUE, NEW_VALUE]와 같이 열 배열의 이름과 키와 해시 값을 반환한다. 예를 들어 상기 catagory위한 'ABC'를 'XYZ'@design의 변화로부터,

    @design.changes   # => {} 
    @design.catagory = 'XYZ'
    @design.changes # => { 'catagory' => ['ABC', 'XYZ'] }
    

    ROR에서 참조 변화에 대한

  6. from https://stackoverflow.com/questions/5051135/rails-3-check-if-attribute-changed by cc-by-sa and MIT license