Есть ли способ перечислить доступные переменные в шаблоне Ruby ERB?

Предположим, у меня есть шаблон Ruby ERB с именем my_template.html.erb, и он содержит следующее:

<div><%= @div_1 %></div>
<div><%= @div_2 %></div>
<div><%= @div_3 %></div>

Есть ли способ программно перечислить все доступные переменные в шаблоне?

Например, следующий метод:

def list_out_variables
  template = File.open("path_to/my_template.html.erb", "rb").read
  erb = ERB.new( template )
  erb.this_method_would_list_out_variables  
end

вернет что-то вроде:

['div1','div2','div3']

Любая помощь будет принята с благодарностью.

Спасибо, Майк


person Mike G    schedule 27.09.2010    source источник
comment
Не знаю, возможно ли это на самом деле, но мне кажется, что это плохая идея. Обычно представление зависит от контроллера, а не наоборот.   -  person Nikita Rybak    schedule 27.09.2010


Ответы (1)


Чтобы получить список переменных, доступных для вашего файла .erb (из контроллера):

Добавьте точку останова в erb:

<% debugger %>

Затем введите в отладчике instance_variables, чтобы увидеть все доступные переменные экземпляра.

Добавлено: обратите внимание, что instance_variables – это метод, доступный из класса Object и все его подклассы. (Как отметил @mikezter.) Таким образом, вы могли бы вызвать метод программно из своего ПО, а не использовать отладчик, если бы вы действительно этого хотели.

Вы получите список переменных экземпляра для текущего объекта.

Добавлено: чтобы получить список переменных, используемых файлом .erb:

# <template> is loaded with the entire contents of the .erb file as
# one long string
var_array = template.scan(/(\@[a-z]+[0-9a-z]*)/i).uniq
person Larry K    schedule 27.09.2010
comment
@mikezter: -1? Кажется немного суровым. Документы отладчика (см. ссылку в ответе) не так ясны. Я бы проголосовал за ваш комментарий, если бы вы просто указали, что ввод instance_variables в отладчике действительно отправляет имя этого метода текущему объекту. - person Larry K; 28.09.2010
comment
Спасибо за помощь! Для всех остальных: группа захвата в регулярном выражении (круглые скобки) не нужна и вызывает вложенный массив, а не просто массив имен переменных. - person Austin Curtis; 12.08.2016