2011-07-29 21 views
14

Có cách nào để khai báo attr_accessible cho nhiều vai trò mà không có một tấn trùng lặp?Rails - Cách khai báo attr_accessible cho nhiều vai trò mà không cần sao chép

Nếu tôi có một số vai trò người sử dụng, và mỗi vai trò được phép chỉnh sửa một tập hợp con khác nhau của các thuộc tính, đây là những gì tuyên bố attr_accessible của tôi trông giống như:

attr_accessible :first_name, :last_name, :active, :as => :admin 
attr_accessible :first_name, :last_name, :as => :manager 
attr_accessible :first_name, :last_name, :as => :guest 

Tôi muốn một trong hai

  • A) xác định một mảng thuộc tính có thể truy cập có thể được chia sẻ trong số vai trò khác nhau hoặc
  • B) xác định một loạt vai trò có thể truy cập cùng một thuộc tính

Điều này có khả thi không?

+0

Bạn đang sử dụng khung ủy quyền nào cho phép bạn hạn chế attr_accessible trên vai trò? Đó không phải là Rails AFAIK chuẩn. – Confusion

+1

Ồ - Tôi đang sử dụng Rails 3.1, vì vậy nó có thể là một tính năng mới hơn. Đối số: as hiển thị trong mô-đun MassAssignmentSecurity (https://github.com/rails/rails/blob/master/activemodel/lib/active_model/mass_assignment_security.rb) –

Trả lời

4

Tất cả các mã ruby ​​vẫn chỉ ruby ​​mã ... và vì thế vô cùng hack. ví dụ:

ROLES = [:admin, :manager, :support, :user, :guest] 
ACTIVE_ROLES = [:admin, :support] 
ROLES.each do |role| 
    fields = [:first_name, :last_name] 
    fields += [:active] if ACTIVE_ROLES.include?(role) 
    attr_accessible *fields, :as => role 
end 
+0

Đối với Rails 3 ứng dụng, hãy xem câu trả lời của @AdrianMacneil –

3

Bạn có thử một cái gì đó như:

COMMON_FIELDS = [:first_name, :last_name] 

attr_accessible COMMON_FIELDS | [:active, :as => :admin] 
attr_accessible COMMON_FIELDS | [:as => :manager] 
attr_accessible COMMON_FIELDS | [:as => :guest] 

Một cách khác có thể (chưa được kiểm tra):

attr_accessible :first_name, :last_name 
ADMIN_ACCESSIBLE = [:active] 
MANAGER_ACCESSIBLE = [] 
GUEST_ACCESSIBLE = [] 

protected 

def mass_assignment_authorizer 
    if role == :all 
    self.class.protected_attributes 
    else 
    super + (eval("#{role}_accessible".upcase) || []) 
    end 
end 
+0

Lưu ý rằng nó chỉ hoạt động với Ruby 1.9 - [: as =>: admin] sẽ gây ra lỗi cú pháp – makaroni4

44

Tôi đã dành một thời gian dài để tìm ra cách tốt nhất để thực hiện việc này. Nó có vẻ kỳ lạ rằng dân gian đường ray sẽ mong bạn lặp lại một loạt các mã!

Sau khi một số đào bới xung quanh trong nguồn ray, nó quay ra bạn chỉ có thể vượt qua một mảng để gán thuộc tính cho nhiều role cùng một lúc (: mặc định là mặc định Active Record vai trò)

attr_accessible :name, :email, :as => [ :default, :admin ]  
attr_accessible :featured, :as => :admin 

Không ruby ​​lộn xộn mảng trong mô hình của bạn!

+2

Cũng giống như để nói rằng đây là mã dễ đọc và dễ đọc hơn câu trả lời được chấp nhận. – theodorton

+0

Vâng, đó là ... nhưng nó cũng là Rails3-cụ thể ... và câu hỏi này đã được hỏi một số thời gian trước đây. –

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