2008-09-26 16 views
12

Mô hình hóa đơn của tôi có thuộc tính address_id và tôi không muốn address_id này thay đổi FOREVER. Vì vậy, tôi không muốn điều này xảy ra bên ngoài lớp:Làm thế nào để bảo vệ thuộc tính mô hình Rails?

invoice.address_id = 1 
invoice.address = some_address 

Rails tự động thêm thuộc tính address_id này với mô hình từ bảng hóa đơn, vậy làm thế nào tôi có thể tuyên bố thuộc tính này tin/bảo vệ? Gọi số

attr_protected :address_id 

rất có thể không phải là giải pháp vì dựa trên tài liệu, nó chỉ ngăn việc gán hàng loạt.

Cảm ơn!

Trả lời

19

Bạn muốn attr_readonly.

+0

Điều này sẽ không ngăn Rails cập nhật và lưu Mô hình trở lại DB không? – Gishu

+0

đẹp - không biết phương thức tồn tại;) @Gishu không, tôi không nghĩ rằng nó sẽ chặn mô hình tiết kiệm - nó sẽ chỉ bỏ qua các thay đổi đối với các trường được liệt kê trong * attributes – ryw

+0

Phương pháp này chỉ có trong Rails 2. * ? Tôi đang chạy trong Rails 1.2.6. – gsmendoza

3

Không xinh đẹp như một lót, nhưng mã dưới đây nên làm việc (và bạn luôn có thể làm một số lập trình meta để viết một phương pháp 'bất biến')

def address_id=(id) 
    if new_record? 
    write_attribute(:address_id, id) 
    else 
    raise 'address is immutable!' 
    end 
end