2013-10-13 14 views
6

Tôi có một Bộ điều khiển Events mà tôi muốn bỏ qua xác thực trong trường hợp sự kiện là công khai.có điều kiện áp dụng skip_before_filter với: if => condition in rails 4

Trong tôi ApplicationController Tôi có cuộc gọi này để đưa ra của authenticate_user!

class ApplicationController < ActionController::Base 
    before_action :authenticate_user! 
end 

bây giờ, Bên trong bảng Sự kiện của tôi, tôi có một lĩnh vực boolean gọi public. Tôi sử dụng nó để kiểm tra xem sự kiện có công khai hay không. Như thế này trong EventsController

class EventsController < ApplicationController 
    skip_before_action :authenticate_user!, only: :show, if: Proc.new { :is_public? } 
end 

Nhưng vì lý do nào đó, điều này không hiệu quả. vì vậy tôi đã phải làm điều này:

class EventsController < ApplicationController 
    skip_before_action :authenticate_user!, only: :show 
    before_action :authenticate_user!, unless: :is_public? 

    def is_public? 
    @event.present? && @event.is_public 
    end 
end 

này hoạt động như mong đợi và bỏ qua xác thực nếu @event.public = true vì lặp đi lặp lại trên các before_filter với điều kiện nghịch đảo sau khi bỏ qua.

tôi tự hỏi:

  1. gì tôi đã làm là đúng?
  2. Điều này có tác động đến hiệu suất hay không. nếu có, thì có cách nào tốt hơn không?
+1

Trong khối thứ hai của mã, bạn có quên dấu chấm hỏi không? 'Proc.new {: is_public}' – Damien

+0

Nopes. Tôi thực sự không thể có được ': if => conditonal' để làm việc, vì vậy không chắc chắn nếu nó phải là': is_pulic? 'Hoặc': is_public' – CuriousMind

+0

Nếu bạn có một trường 'public', nó có thể là' public' hoặc 'public?'. Di chuyển phương thức 'is_public?' Sang mô hình 'Sự kiện' nếu bạn muốn sử dụng nó. – Damien

Trả lời

6

tài liệu đường ray về cuộc gọi lại (trước, sau, xung quanh hành động) thực sự khá tệ. xem câu hỏi tương tự này: skip_before_filter ignores conditionals

vì vậy tôi luôn tham khảo hướng dẫn đường ray. phần mà sẽ là thú vị cho bạn là ở đây: http://guides.rubyonrails.org/action_controller_overview.html#other-ways-to-use-filters

tôi không hoàn toàn chắc chắn rằng điều này sẽ làm việc với bộ lọc bỏ qua là tốt, nhưng nó là giá trị một thử.

không nên có tác động hiệu suất chỉ bằng cách gọi các bộ lọc khác nhau. các vấn đề về hiệu suất thường đến từ các truy vấn cơ sở dữ liệu mở rộng hoặc các cuộc gọi hệ thống bên ngoài khác.

mối quan tâm chính của tôi ở đây sẽ là khó hiểu tại sao có quá nhiều thứ trước đây xảy ra ...

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