Создание помощников динамических областей в Rails - PullRequest
1 голос
/ 19 ноября 2010

Некоторые из моих частичек могут быть отображены в двух «режимах». Если full_display равно false, я не отображаю несколько полей. Чтобы упростить задачу, я хотел установить один из «режимов» по ​​умолчанию - если full_display не определен, трактовать его как false. Я придумал этот код:

(((not defined?(full_display).nil?) && full_display) || false)

Довольно много, чтобы двигаться. Было бы неплохо поместить его в помощник или что-то в этом роде, но поскольку у Ruby есть только лексическая область, я не могу придумать ни одного хорошего способа сделать это.

Плохие идеи, которые я уже попробовал:

  • в верхней части частичного do <% display = long code that is above %> и использовать отображение через код, но создание локальных переменных в представлении выглядит плохо и должен быть скопирован в каждый частичный с использованием full_display.
  • оберните его внутри строки, поместите в помощник и используйте eval (display_helper) в поле зрения, но, очевидно, это создает проблемы безопасности.

1 Ответ

2 голосов
/ 19 ноября 2010

Это довольно запутанный способ сказать что-то такое простое, как:

defined?(full_display) && full_display

В Ruby есть два значения, которые не соответствуют действительности, nil и false, все остальные оцениваются как true, включая 0, пустую строку, среди прочих, которые в противном случае оценивались бы как false в Perl, PHP, и C. Тестирование с помощью .nil? обычно резервируется для тех редких случаев, когда вы хотите провести различие между false и неопределенным, и это иногда имеет место с логическими полями, где пропущенное значение отличается от ложного значения.

В любом случае в области просмотра намного проще назначить значения по умолчанию с помощью оператора or-equals ||=, например:

<% full_display ||= false %>

Это эквивалентно full_display = full_display || false. Это делает две вещи. Во-первых, она определяет переменную full_display, даже если она не была создана ранее, а во-вторых, она гарантирует, что она будет содержать значение, которое по крайней мере false, никогда не будет неопределенным.

Вы часто увидите шаблон ||= default в коде Ruby, поскольку это простой способ назначить что-либо в случае, если в противном случае будет nil.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...