2010-10-06 20 views
5

Trong đường ray, khi cập nhật một mô hình, làm thế nào để bạn ngăn chặn các thuộc tính nhất định của mô hình từ được cập nhật khi sử dụng một cuộc gọi như:Ngăn không cho các thuộc tính nhất định được cập nhật?

@user.update_profile params[:user] 

Kể từ khi bất cứ ai có thể chỉ cần tạo một đầu vào mẫu với một tên như 'mật khẩu' , làm thế nào bạn có thể lọc tập hợp các thuộc tính mà bạn đang cho phép có thể cập nhật?

Đây có phải là attr_XXX dành cho không?

+1

Whitelist vs danh sách đen, danh sách trắng được khuyến khích. – Swanand

Trả lời

6

Bạn đang tìm kiếm attr_accessible. Nó cho phép bạn chỉ định các thuộc tính nào có thể được thiết lập thông qua cập nhật hàng loạt (như update_attributes), nhưng bạn vẫn có thể thiết lập các thuộc tính "thủ công" (nghĩa là @user.attribute = ...).

Để biết thêm thông tin, hãy xem The importance of attr_accessible in Ruby on Rails.

+0

ok để ngăn chặn cập nhật hàng loạt trong các bài đăng biểu mẫu, v.v. đúng không? – Blankman

+0

@Blankman Đúng, bất kỳ thuộc tính nào không được chỉ định là có thể truy cập sẽ không thể cập nhật thông qua 'params'. –

4

Bạn đang tìm kiếm attr_protected để danh sách đen bất kỳ thuộc tính nào bạn không muốn thay đổi trong bản cập nhật hàng loạt. Ném nó vào mô hình của bạn và cung cấp cho nó một danh sách các biểu tượng thuộc tính vào danh sách đen.

class User < ActiveRecord::Base 
    attr_protected :password 
end 

Hoặc bạn có thể sử dụng attr_accessible để tiếp cận danh sách trắng và chỉ các thuộc tính nhất định có thể được cập nhật khi cập nhật toàn bộ bản ghi cùng một lúc. Mỗi thuộc tính khác sẽ được bảo vệ.

N.B thuộc tính bảo vệ vẫn có thể được ghi đè nếu nó được gán trực tiếp như trong

@user.password = "not secure" 
+2

Lưu ý rằng 'attr_protected' và' attr_accessible' (mà tôi đã đề cập trong câu trả lời của tôi), là hai mặt của cùng một đồng tiền. 'attr_accessible' làm cho bạn liệt kê các thuộc tính mà bạn muốn ** để có thể cập nhật hàng loạt; 'attr_protected' liệt kê các thuộc tính mà bạn không muốn ** có thể cập nhật được. –

+0

Tuy nhiên, với 'attr_accessible', nếu bạn đã thêm nhiều thuộc tính vào mô hình của mình, bạn sẽ không phải lo lắng về việc chúng có thể truy cập được trừ khi bạn chỉ định chúng như vậy; với 'attr_protected', mọi thuộc tính mới sẽ có thể truy cập được. Tất nhiên, đó là câu trả lời đúng tùy thuộc vào những gì bạn mong đợi xảy ra (mặc dù một số người nghĩ rằng nó thích hợp hơn để liệt kê rõ ràng những gì bạn muốn để không có bất kỳ điều gì bất ngờ). –

+0

@Daniel Vandersluis: Đúng vậy. Danh sách trắng với attr_accessible là một chiến lược bảo mật tốt hơn nhiều so với danh sách đen với attr_protected. Nhưng cách câu hỏi được diễn đạt ngụ ý cách tiếp cận danh sách đen được ưu tiên. – EmFi

Các vấn đề liên quan