Правильный ответ зависит от того, против чего вы хотите обменяться.
Компромиссы
В этом случае следует учитывать несколько моментов:
- Удобочитаемость / понятность
- Дублирование
- Количество строк кода
- Расширяемость
Что вы цените больше всего?
Моя точка зрения
Лично я ценю удобочитаемость выше, чем большинство других вещей, включая дублирование.
По моему опыту, очень легко стать одержимым 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