Bạn đang sử dụng một số thuật ngữ kỹ thuật theo những cách mơ hồ làm cho sự hiểu biết của bạn về quá trình này bị xáo trộn, vì vậy tôi sẽ làm rõ thuật ngữ này trước tiên.
ở đâu và làm thế nào tôi có thể gán người dùng: admin vai trò
Các 'vai trò' được sử dụng trong các tham số :as
để attr_accessible
không phải là một vai trò người dùng. Đây là vai trò thuộc tính. Nó có nghĩa là thuộc tính được bảo vệ khỏi ghi đè trừ khi vai trò đó được xác định trong câu lệnh đặt thuộc tính. Vì vậy, hệ thống này độc lập với bất kỳ hệ thống người dùng nào. Ứng dụng của bạn thậm chí không cần phải có người dùng để có vai trò trong giao hàng loạt.
tôi có thể xác định vai trò của mình như group_to_update
Vai trò không thực sự "định nghĩa" trong bất kỳ ý nghĩa chính thức nào cả. Ở bất kỳ nơi nào mà vai trò được mong đợi, chỉ cần sử dụng bất kỳ biểu tượng/chuỗi nào (ví dụ: :group_to_update
) làm vai trò. Không cần phải xác định nó bất cứ nơi nào khác trước thời hạn.
Đây là cách hoạt động. Thông thường, trong quá trình gán khối lượng của một hàm băm cho các thuộc tính mô hình, tất cả các thuộc tính của mô hình được sử dụng như các khóa cho hàm băm được chỉ định.Vì vậy, nếu bạn có một mô hình Barn
và barn
thể hiện của nó, với ba thuộc tính horse
, cat
, và rabbit
, thì đây:
barn.attributes = params
về cơ bản là giống như thực hiện:
barn.horse = params[:horse]
barn.cat = params[:cat]
barn.rabbit = params[:rabbit]
Bây giờ, nếu bạn đặt bất kỳ attr_accessible
nào trên mô hình chuồng, chỉ những thuộc tính bạn đặt ở đó sẽ được cập nhật khi bạn sử dụng gán hàng loạt. Ví dụ:
class Barn < ActiveRecord::Base
attr_accessible :cat
attr_accessible :rabbit
end
Sau đó này:
barn.attributes = params
Sẽ chỉ làm điều này:
barn.cat = params[:cat]
barn.rabbit = params[:rabbit]
Bởi vì chỉ có 'mèo' và 'thỏ' được thiết lập để truy cập ('ngựa' không phải là). Bây giờ xem xét việc thiết một vai trò quan thuộc tính như thế này:
class Barn < ActiveRecord::Base
attr_accessible :cat
attr_accessible :rabbit, :as => :banana
end
Đầu tiên, lưu ý rằng vai trò có thể bởi bất cứ điều gì bạn muốn miễn là nó là một biểu tượng/chuỗi. Trong trường hợp này, tôi đã thực hiện vai trò :banana
. Bây giờ, khi bạn đặt vai trò trên thuộc tính attr_accessible
, thông thường nó sẽ không được gán. Đây:
barn.attributes = params
sẽ bây giờ chỉ làm điều này:
barn.cat = params[:cat]
Nhưng bạn có thể gán thuộc tính sử dụng một vai trò cụ thể bằng cách sử dụng phương pháp assign_attributes
. Vì vậy, bạn có thể làm:
barn.assign_attributes(params, :as => :banana)
này sẽ gán tất cả params thường được bảo vệ cũng như tất cả params được bảo vệ dưới vai trò :banana
:
barn.cat = params[:cat]
barn.rabbit = params[:rabbit]
Vì vậy, hãy xem xét một ví dụ nữa với nhiều thuộc tính:
class Barn < ActiveRecord::Base
attr_accessible :cat
attr_accessible :rabbit, :as => :banana
attr_accessible :horse, :as => :banana
attr_accessible :cow, :as => :happiness
end
Sau đó, bạn có thể sử dụng các vai trò đó khi gán thuộc tính. Đây:
barn.assign_attributes(params, :as => :banana)
Tương ứng với:
barn.cat = params[:cat]
barn.rabbit = params[:rabbit]
barn.horse = params[:horse]
Và đây:
barn.assign_attributes(params, :as => :happiness)
Tương ứng với:
barn.cat = params[:cat]
barn.cow = params[:cow]
Bây giờ, nếu bạn chọn để , bạn có thể tạo vai trò người dùng (ví dụ: cột "vai trò" trên Mô hình người dùng của bạn) tương ứng với vai trò thuộc tính trên bất kỳ mô hình nào.Vì vậy, bạn có thể làm một cái gì đó như thế này:
barn.assign_attributes(params, :as => user.role)
Nếu vai trò này của user
sẽ xảy ra là banana
, sau đó (sử dụng mô hình cuối cùng dụ của chúng tôi) nó sẽ thiết lập các thuộc tính về chuồng cho mèo, thỏ, và ngựa. Nhưng đây chỉ là một cách để sử dụng vai trò thuộc tính. Nó hoàn toàn tùy thuộc vào bạn nếu bạn muốn sử dụng chúng theo một cách khác.
+1 Câu trả lời hay. – Gazler
Cảm ơn bạn. Nó có lẽ là bài viết duy nhất đi vào chi tiết tuyệt vời về vai trò trong attr_accessible. Một câu hỏi nữa, làm thế nào vai trò sẽ ngăn cản việc chuyển nhượng hàng loạt xảy ra? Không có cách nào để một hacker có thể bao gồm vai trò trong URL? – user938363
Câu trả lời hay. Điều này nên ở đâu đó [trong hướng dẫn?] Trong tài liệu Rails. – maprihoda