첫 번째 업데이트 후에 각 레코드에 대해 속성을 읽기 전용으로 만들고 싶습니다. attr_readonly를 사용하여 Rails 4에서이 작업을 수행 할 수있는 방법이 있습니까? 아니면 다른 방법? 그들은 업데이트 여부를 봤는데 여부는, 모델의 모든 인스턴스에 속성을 "동결"할 수 있도록Rails 4 attr_readonly on update
그것은 트랜잭션 보안과 관련이있다 ...
첫 번째 업데이트 후에 각 레코드에 대해 속성을 읽기 전용으로 만들고 싶습니다. attr_readonly를 사용하여 Rails 4에서이 작업을 수행 할 수있는 방법이 있습니까? 아니면 다른 방법? 그들은 업데이트 여부를 봤는데 여부는, 모델의 모든 인스턴스에 속성을 "동결"할 수 있도록Rails 4 attr_readonly on update
그것은 트랜잭션 보안과 관련이있다 ...
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
이 변경되면 유효성 검사가 실패하고 유용한 오류 메시지가 표시됩니다.
도움이 되었기를 바랍니다.
충분히 닫습니다. 현재 다른 매개 변수를 변경하는 것과 함께 트랜잭션 블록 내에서 TRUE로 비슷한 속성을 설정하고 있지만 before_update 유효성 검사를 사용하면 후속 사용자가 동일한 레코드를 수정하지 못하게됩니다. 기대. Postgres에는 Update에서도 레코드를 고정 할 방법이 없다고 생각합니다. 괜찮을거야. –
첫 번째 업데이트 후 또는 생성시? – DickieBoy
첫 번째 업데이트 이후에만 그 속성이 (nil으로) 생성하고 첫 번째 업데이트 이후에 고정되기를 원합니다. –
컨트롤러에 이것을 구현하고 적용한 모든 업데이트에서 해당 매개 변수를 삭제해야합니다. – tadman