Подтвердить что ты не робот

Если помощники 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!

Этот вопрос здесь схож, но никогда не был точно ответил.

4b9b3361

Ответ 1

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

Кроме того, я считаю, что существует общая передовая практика только для использования экземпляров vars в представлениях в исходном шаблоне... и оттуда вы должны передать var в помощники и другие частичные.

Ответ 2

Я бы сказал, что вы должны всегда передавать переменные явно своему помощнику по двум причинам:

  • вы точно контролируете, что вы делаете

  • вы можете проверить свой помощник

Ответ 3

Я не знаю, есть ли какой-либо именованный принцип, регулирующий подобные вещи, но я бы принял аргумент. Мало того, что аргумент заставит вашего помощника легче протестировать и поток данных ваших приложений будет легче следовать, но он также позволит вам использовать один помощник для одного экземпляра, а также список; если вы передадите аргумент, то оба:

<%= cockadoodledoo @egg %>

и

<% @eggs.each do |egg| %>
    <%= cockadoodledoo egg %>
<% end %>

будет работать, как ожидалось, без специального cockadoodledoo, который обрабатывает список в @eggs, а не один @egg.

Ответ 4

Поскольку вспомогательные сообщения смешиваются со всеми контроллерами, поэтому доступны для всех представлений (включая частичные и макеты), всегда разумно устанавливать четкий контракт - параметры.

Единственное исключение, о котором я мог подумать, - это когда переменная экземпляра также доступна для всех представлений и контроллеров, например меню или что-то подобное.