необязательные локальные переменные в частичных шаблонах rails: как мне выйти из (определенного? foo) беспорядка? - PullRequest
214 голосов
/ 14 января 2010

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

<% foo = default_value unless (defined? foo) %>

Это, казалось, работало нормально до недавнего времени, когда (без причины я мог различить) непропущенные переменные начали вести себя так, как будто они были определены как ноль (а не как неопределенные).

Как указывалось различными полезными людьми на SO, http://api.rubyonrails.org/classes/ActionView/Base.html говорит не для использования

defined? foo

и вместо этого использовать

local_assigns.has_key? :foo

Я пытаюсь изменить свои способы, но это означает, что нужно изменить множество шаблонов.

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

Ответы [ 12 ]

0 голосов
/ 17 ноября 2011

Более интуитивно понятный и компактный:

<% some_local = default_value unless local_assigns[:some_local] %>

0 голосов
/ 30 марта 2010

Можно создать помощника, который будет выглядеть следующим образом:

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 в качестве значения без переопределения.

...