2012-03-05 13 views
12

Tôi đang sử dụng thiết kế và cancan trong dự án Rails 3.2. Tôi có một mô hình sự kiện với cờ boolean công khai. Nếu sự kiện được đánh dấu là công => true sau đó tôi muốn bất cứ ai, đăng nhập hay không để có thể truy cập vào kỷ lục vớiCách tốt nhất để bỏ qua ủy quyền cho một bản ghi cụ thể được đánh dấu là công khai

GET /events/:id 

Nếu nó được đánh dấu là công => sai sau đó một loạt khả năng cancan sẽ quyết định cấp phép và truy cập vào tài nguyên trên.

Mẫu tốt nhất để đạt được điều này là gì?

Trả lời

21

Bạn có thể làm điều đó bằng cách bỏ qua authenticate_user! trong trường hợp bạn có điều này args

skip_before_filter :authenticate_user!, :only => :show, :if => lambda { 
    if params[:id] 
     @event = Event.find(params[:id]) 
     @event and @event.public? 
    else 
     false 
    end 
    } 
+0

Thực tế tham số là một trường trong tài nguyên nhưng bây giờ tôi nghĩ về nó tất nhiên tôi có thể tải tài nguyên trong lambda và kiểm tra trường. – bradgonesurfing

+0

Các tham số [: id] là mã định danh tài nguyên và nếu tài nguyên được đánh dấu công khai thì không cần xác thực. Bạn có thể đề xuất phương pháp khác không? – bradgonesurfing

+0

Giải pháp này dường như không còn được dùng nữa. Kiểm tra điều này: https://github.com/rails/rails/issues/9703. – Spyros

-2

Không, không bỏ qua xác thực. Bạn muốn bỏ qua ủy quyền. Một giải pháp tốt hơn sẽ là cho phép rõ ràng các sự kiện với public => true.

Trong lớp khả năng Cancan của bạn:

can :read, Event do |e| 
    some_other_authorization_boolean || e.public? 
end 

Khả năng này sẽ được trao cho tất cả người dùng; ngay cả những người không đăng nhập.

+5

Nếu bạn không bỏ qua xác thực thì bạn sẽ bị ném trở lại màn hình đăng ký. Ủy quyền CANCAN chỉ xảy ra ** sau khi ** xác thực đã có cơ hội hủy bỏ chuỗi bộ lọc. – bradgonesurfing