Если помощники Rails предполагают наличие переменной экземпляра или должны ли они получать их в качестве параметров?
Мне интересно, существует ли какой-то конкретный принцип программирования (Demeter?), который поддерживает идею о том, что помощники Rails никогда не должны использовать переменные экземпляра контроллера, а должны получать такие переменные, как параметры функции. Например, предположим, что мое действие ChickensController#squawk
создает переменную экземпляра с именем @egg
. Кроме того, предположим, что представление squawk
содержит вызов помощника под названием cockadoodledoo
, реализованного так:
def cockadoodledoo
@egg.to_s
end
Было бы лучше или излишне подробно передавать @egg
в качестве параметра, так что представление вызывает cockadoodledoo(@egg)
и для помощника, чтобы он напоминал:
def cockadoodledoo(egg)
egg.to_s
end
Я надеюсь, что один из вас, счастливые хакеры, достаточно скучно в пятницу днем, чтобы ответить. Cockadoodledoo!
Этот вопрос здесь схож, но никогда не был точно ответил.
Ответы
Ответ 1
Получите их как параметр. В противном случае, по мере того, как приложение растет, очень сложно отслеживать, где устанавливаются экземпляры vars при рефакторинге, устранении неполадок и т.д.
Кроме того, я считаю, что существует общая передовая практика только для использования экземпляров vars в представлениях в исходном шаблоне... и оттуда вы должны передать var в помощники и другие частичные.
Ответ 2
Я бы сказал, что вы должны всегда передавать переменные явно своему помощнику по двум причинам:
Ответ 3
Я не знаю, есть ли какой-либо именованный принцип, регулирующий подобные вещи, но я бы принял аргумент. Мало того, что аргумент заставит вашего помощника легче протестировать и поток данных ваших приложений будет легче следовать, но он также позволит вам использовать один помощник для одного экземпляра, а также список; если вы передадите аргумент, то оба:
<%= cockadoodledoo @egg %>
и
<% @eggs.each do |egg| %>
<%= cockadoodledoo egg %>
<% end %>
будет работать, как ожидалось, без специального cockadoodledoo
, который обрабатывает список в @eggs
, а не один @egg
.
Ответ 4
Поскольку вспомогательные сообщения смешиваются со всеми контроллерами, поэтому доступны для всех представлений (включая частичные и макеты), всегда разумно устанавливать четкий контракт - параметры.
Единственное исключение, о котором я мог подумать, - это когда переменная экземпляра также доступна для всех представлений и контроллеров, например меню или что-то подобное.