2014-08-29 2 views
2

첫 번째 업데이트 후에 각 레코드에 대해 속성을 읽기 전용으로 만들고 싶습니다. attr_readonly를 사용하여 Rails 4에서이 작업을 수행 할 수있는 방법이 있습니까? 아니면 다른 방법? 그들은 업데이트 여부를 봤는데 여부는, 모델의 모든 인스턴스에 속성을 "동결"할 수 있도록Rails 4 attr_readonly on update

그것은 트랜잭션 보안과 관련이있다 ...

+0

첫 번째 업데이트 후 또는 생성시? – DickieBoy

+0

첫 번째 업데이트 이후에만 그 속성이 (nil으로) 생성하고 첫 번째 업데이트 이후에 고정되기를 원합니다. –

+0

컨트롤러에 이것을 구현하고 적용한 모든 업데이트에서 해당 매개 변수를 삭제해야합니다. – tadman

답변

3

attr_readonly는, 클래스의 방법이다.

당신이 원하는 것을 할 수있는 sanest 방법, 생각, 모델에 some_attribute_is_frozen 부울 속성을 추가 할 수 있으며, 다음 before_update 콜백 true로 설정합니다. 그런 다음 some_attribute_is_frozen?true 일 경우에만 실행되고 "고정"속성이 변경되면 실패 할 유효성 검증을 가질 수 있습니다. (I 임의로 당신이 "동결"할 속성의 이름과 모델과 address의 이름으로 "고객"을 선택한 예를 위해서)이 같은

뭔가 :

# $ rails generate migration AddAddressIsFrozenToCustomers 
# => db/migrate/2014XXXX_add_address_is_frozen_to_customers.rb 
class AddAddressIsFrozenToCustomers < ActiveRecord::Migration 
    def change 
    add_column :customers, :address_is_frozen, :boolean, 
     null: false, default: false 
    end 
end 
# app/models/customer.rb 
class Customer < ActiveRecord::Base 
    before_update :mark_address_as_frozen 
    validate :frozen_address_cannot_be_changed, if: :address_is_frozen? 

    # ...snip... 

    private 
    def mark_address_as_frozen 
    self.address_is_frozen = true 
    end 

    def frozen_address_cannot_be_changed 
    return unless address_changed? 
    errors.add :address, "is frozen and cannot be changed" 
    end 
end 

the before_update callback runs after validation 때문에, 레코드가 업데이트되는 매우 처음 address_is_frozen?false을 반환하고 유효성 검사가 생략됩니다. 하지만 다음 업데이트에서는 address_is_frozen?true을 반환하므로 유효성 검사가 실행되고 address이 변경되면 유효성 검사가 실패하고 유용한 오류 메시지가 표시됩니다.

도움이 되었기를 바랍니다.

+0

충분히 닫습니다. 현재 다른 매개 변수를 변경하는 것과 함께 트랜잭션 블록 내에서 TRUE로 비슷한 속성을 설정하고 있지만 before_update 유효성 검사를 사용하면 후속 사용자가 동일한 레코드를 수정하지 못하게됩니다. 기대. Postgres에는 Update에서도 레코드를 고정 할 방법이 없다고 생각합니다. 괜찮을거야. –