2008-11-12 2 views
7

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

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

Должен ли я вернуть 0 вместо нуля? Есть ли какой-либо другой шаблон, который я мог бы использовать, чтобы не делать кучу нулевых проверок в моих представлениях?

ответ

8

Я склонен думать, что вы делаете все правильно, если ваша проблема заключается в выборе отображения или отсутствия отображения результатов расчета. Если было бы бессмысленно отображать какое-либо значение, то nil вполне разумно.

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

Рассмотрите, например, приложение, которое начинается с отслеживания рецептов для Food. Затем, поскольку требования морфинга, мы получаем понятие пирогов, нуждающихся в отображении различной информации, чем гамбургеры. Вместо того, чтобы иметь метод calculate_deliciousness_of_pie_or_nil_for_burger, а затем, проверяя нуль в представлении, я разбил бы это в виде пирога для пирогов и гамбургера для гамбургеров. Это может (возможно, потребовалось бы) потребовать переосмысления абстракций моего объекта.

3

«Я делаю много нулевых проверки перед отображением этих значений в моих взглядах.»

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

{:result => 1234} 

и если метод «не удалось», я мог бы вернуться:

{:error => 'Insufficient attributes to calculate result.'} 

Это делает тривиальной для определения результата не догадываясь.

С учетом этого убедитесь, что вы создаете вспомогательные методы для вызова этих методов и проверки их результатов. В представлениях должно быть очень мало логики. Таким образом, вместо того, чтобы делать это, чтобы управлять, отображается ли не результат:

<% if result = some_method -%> 
    Your result is <%=h result -%>.<br /> 
<% end -%> 

Вы должны сделать это:

<% display_some_method %> 

и #display_ some_ метод находится в приложение/хелперов/whatever_helper.rb.

+1

Вы должны использовать == в приведенном выше примере. – maurycy 2008-12-26 20:00:31

1

Я атакую ​​эту проблему, используя два подхода.

Я пытаюсь переместить более требовательные чеки в модель.Например, метод Apartment#address_visible?(current_user) делает его намного более чистым.

С Rails 2.3 существует также метод #try, который вызывает метод, только если он уже определен. Его можно легко включить в свой проект, используя chris 'example. Это для самых простых случаев.

+0

, если вы не на 2.3, есть также andand http://github.com/raganwald/andand – 2009-02-18 03:20:02

Смежные вопросы