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:
- gì tôi đã làm là đúng?
- Đ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?
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
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
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