Указание исключений для Rails Filters (иначе Action Callbacks) контроллером - PullRequest
0 голосов
/ 01 февраля 2019

После https://guides.rubyonrails.org/action_controller_overview.html#filters, У меня есть метод pull_alerts, который мне нужно запустить перед выполнением ряда действий.Эти действия выполняются в нескольких разных контроллерах, поэтому у меня есть код в application_controller.rb :

class ApplicationController < ActionController::Base

  before_action :pull_alerts, only: [:home, :profile, :show, :new]

  private

    def pull_alerts
      @unread_notifications = <... some code here ...>
    end

end

Это хорошо работает, когда home и profile являются именами двухдействия в pages_controller.rb и show и new являются именами двух действий в widget_controller.rb .

Теперь я хочу запустить pull_alertsдо действия show в третьем контроллере - например. doodad_controller.rb - но не до действия new в этом контроллере.Мне не удалось найти ссылку на то, как указать это (пространство имен / область действия?) В условии:

before_action :pull_alerts, only: [:home, :profile, :show, :new]

Каков наилучший способ структурировать это расположение?Нужно ли убрать это из application_controller.rb и указать before_action в каждом отдельном контроллере (страницах, виджетах, рисунках)?Если я сделаю это, где я могу поместить метод, чтобы он был СУХИМ?Или лучше добавить это в doodad_controller.rb вот так?

class DoodadsController < ApplicationController

  skip_before_action :pull_alerts, only: [:new]

end

1 Ответ

0 голосов
/ 01 февраля 2019

Правильный ответ зависит от того, против чего вы хотите обменяться.

Компромиссы

В этом случае следует учитывать несколько моментов:

  • Удобочитаемость / понятность
  • Дублирование
  • Количество строк кода
  • Расширяемость

Что вы цените больше всего?

Моя точка зрения

Лично я ценю удобочитаемость выше, чем большинство других вещей, включая дублирование.

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

Решение

# application_controller.rb
class ApplicationController < ActionController::Base
  def pull_alerts
    @unread_notifications = <... some code here ...>
  end
end

# home_controller.rb
class HomeController < ActionController::Base
  before_action :pull_alerts, only: [:show, :new]
end

# profile_controller.rb
class ProfileController < ActionController::Base
  before_action :pull_alerts, only: [:show, :new]
end

# doodad_controller.rb
class DoodadController < ActionController::Base
  before_action :pull_alerts, only: :show
end

Конечно, есть некоторое дублирование.Но если вы читаете код, вы можете в считанные секунды сказать, что происходит.

Для сравнения

Этот код:

class DoodadsController < ApplicationController
  skip_before_action :pull_alerts, only: :new
end

требует, чтобы вы посмотрели, какие действия pull_alerts называется раньше.Тогда вам нужно думать о «негативе» - то есть о том, что пропущено.

Еще один недостаток здесь - это расширяемость - если вы хотите вызвать pull_alerts до :update, он начинает сбиваться с толку, чтобы узнать,pull_alerts по-прежнему вызывается при обновлении в DoodadsController

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...