Я был плохим ребенком и использовал следующий синтаксис в моих частичных шаблонах, чтобы установить значения по умолчанию для местных переменных, если стоимость не была явно определена в: местные жители крошат, отдавая частичное-
<% foo = default_value unless (defined? foo) %>
Это, казалось, хорошо работало до недавнего времени, когда (ни по какой причине я мог различить), не прошел, переменные начали вести себя, как будто они были определены к нолю (а не неопределенные).
Как был указан различными услужливыми людьми на Так, в http://api.rubyonrails.org/classes/ActionView/Base.html говорится, чтобы не использовать
defined? foo
и вместо этого использовать
local_assigns.has_key? :foo
Я пытаюсь исправить свои пути, но это означает изменять много шаблонов.
Могут/должны я просто заряжаю вперед и вношу это изменение во всех шаблонах? Есть ли ловкость, за которой я должен наблюдать? Как старательно я должен проверить каждого?
Я делаю так:
<% some_local = default_value if local_assigns[:some_local].nil? %>
Как насчет
<% foo ||= default_value %>
Здесь сказано "использовать foo
, если это не ноль или не правда". В противном случае присвойте default_value
foo"
Помощник может быть создан следующим образом:
somearg = opt(:somearg) { :defaultvalue }
Реализован как:
module OptHelper
def opt(name, &block)
was_assigned, value = eval(
"[ local_assigns.has_key?(:#{name}), local_assigns[:#{name}] ]",
block.binding)
if was_assigned
value
else
yield
end
end
end
См. мой блог для получения подробной информации о том, как и почему.
Обратите внимание, что это решение позволяет передавать в качестве значения nil или false без его переопределения.