Как получить необязательную локальную переменную в частичном шаблоне в рельсах?
Я думал, что в верхней части моей частички у меня будет что-то вроде этого
<% 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
она вообще не упоминается, сохраняя ее значение с первого запуска. Невозможно выполнить такую проверку прямо сейчас.