Должны ли помощники Rails предполагать, что переменная экземпляра существует, или они должны получать их в качестве параметров? - PullRequest
39 голосов
/ 25 июня 2011

Мне интересно, существует ли какой-то особый принцип программирования (Demeter?), Который поддерживает идею, что помощники Rails никогда не должны использовать переменные экземпляра контроллера, скорее, они должны получать такие переменные в качестве параметров функции.Например, предположим, что мое действие ChickensController#squawk создает переменную экземпляра с именем @egg.Кроме того, предположим, что представление squawk содержит вызов помощника с именем cockadoodledoo, реализованного так:

def cockadoodledoo
  @egg.to_s
end

Было бы лучше или излишне многословно передавать @egg в качестве параметра, такого, чтобыпредставление вызывает cockadoodledoo(@egg), и помощник должен напоминать:

def cockadoodledoo(egg)
  egg.to_s
end

Надеюсь, одному из вас, счастливым хакерам, в пятницу днем ​​будет достаточно скучно, чтобы утверждать ответ.Cockadoodledoo!

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

Ответы [ 4 ]

32 голосов
/ 25 июня 2011

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

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

19 голосов
/ 25 июня 2011

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

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

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

11 голосов
/ 25 июня 2011

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

<%= cockadoodledoo @egg %>

и

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

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

7 голосов
/ 25 июня 2011

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

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

...