Как получить необязательную локальную переменную в частичном шаблоне в рельсах?

Я думал, что в верхней части моей частички у меня будет что-то вроде этого

<% optional_width = default_value unless (defined? optional_width) 

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

Ответы

Ответ 1

Прочитайте раздел "Передача локальных переменных в подфайлы" в ActionView:: Base docs

В основном говорится, что вы должны использовать этот шаблон:

<% if local_assigns.has_key? :headline %>
  Headline: <%= headline %>
<% end %>

Для вас это может означать следующее:

<div style="width: <%= local_assigns.has_key?(:optional_width) ? optional_width : 500 %>px;">
  <!-- filler -->
</div>

важно!

В соответствии с документами

Тестирование с использованием defined? headline не будет работать. Это ограничение реализации.

Ответ 2

Хотя это не совсем эквивалентно вашему коду, обычно выполняемому с помощью оператора ||.

<%  optional_width ||= default_value  %>

Это эквивалентно optional_width = optional_width || default_value. Из-за оценка затухания, если optional_with является "истинным", то есть определено, а не nil, правая часть становится равной ему, а default_value даже не вычисляется. В противном случае правая часть будет равна default_value. Это, по сути, то, что вы хотите сделать.

Хорошо, я признаю, что это может не работать для частичных локалей. Особую ситуацию, которую я могу себе представить, заключается в том, что если в первом вызове рендеринга переменная optional_width была установлена ​​на какое-то значение, а в последующем вызове render она вообще не упоминается, сохраняя ее значение с первого запуска. Невозможно выполнить такую ​​проверку прямо сейчас.