У меня есть контроллер Events
, на котором я хочу пропустить аутентификацию, если событие является общедоступным.
В моем ApplicationController
у меня есть этот призыв к разработке authenticate_user!
class ApplicationController < ActionController::Base
before_action :authenticate_user!
end
теперь внутри моей таблицы событий у меня есть логическое поле с именем public
. Я использую это, чтобы проверить, является ли событие публичным или нет. Вот так в EventsController
class EventsController < ApplicationController
skip_before_action :authenticate_user!, only: :show, if: Proc.new { :is_public? }
end
Но почему-то это не сработало. поэтому мне пришлось сделать это:
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
Это работает так, как ожидается, и пропускает аутентификацию, если @event.public = true
, потому что вышеприведенное повторяет before_filter
с обратным условием после пропуска.
Мне интересно:
- что я сделал правильно?
- Влияет ли это на производительность. если да, то есть ли способ лучше?