Nano Hash - криптовалюты, майнинг, программирование

условно применить skip_before_filter с условием :if =› в rails 4

У меня есть контроллер 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 с обратным условием после пропуска.

Мне интересно:

  1. что я сделал правильно?
  2. Влияет ли это на производительность. если да, то есть ли способ лучше?

  • Во втором блоке кода вы намеренно забыли вопросительный знак? Proc.new { :is_public } 13.10.2013
  • Нет. На самом деле я не мог заставить этот :if => conditonal работать, поэтому не уверен, должен ли он быть :is_pulic? или :is_public 13.10.2013
  • Если у вас есть поле public, оно может быть public или public?. Переместите метод is_public? в свою модель Event, если хотите его использовать. 13.10.2013

Ответы:


1

документация рельсов по обратным вызовам (до, после, вокруг действия) на самом деле довольно плохая. см. аналогичный вопрос: skip_before_filter игнорирует условия

поэтому я всегда обращаюсь к направляющим рельсам. часть, которая была бы вам интересна, находится здесь: http://guides.rubyonrails.org/action_controller_overview.html#other-ways-to-use-filters

я не совсем уверен, что это будет работать и с пропускным фильтром, но попробовать стоит.

просто вызов разных фильтров не должен влиять на производительность. проблемы с производительностью обычно возникают из-за обширных запросов к базе данных или других внешних системных вызовов.

меня больше всего беспокоит то, что довольно сложно понять, почему происходит так много вещей before_action...

13.10.2013
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..