erb дает мне - неопределенная локальная переменная или метод для main: Object (NameError) - PullRequest
1 голос
/ 29 декабря 2011

erb дает мне undefined local variable or method for main:Object (NameError), если только переменная, используемая в шаблоне erb, не является глобальной.

Это правильно? на ruby ​​1.8.7 (2010-01-10 patchlevel 249) [i486-linux]

Ниже приведен код, который работает. Если я удаляю $ из имени переменной ($ db, $ db_root, $ db_root_password), я получаю сообщение об ошибке.

$db = get_single_argument("database name")
$db_root = get_single_argument("database root user name")
$db_root_passwd = get_single_argument("database root user password")

mysql_commands = get_conf_file("installer_mysql.erb")

puts mysql_commands.result  #gives me the error

и get_conf_file процедура

def get_conf_file(file)

 return_array = Array.new
 if (File.exists?(file))
   return_array = ERB.new File.read(file)
 end
 return_array
end

Ответы [ 2 ]

9 голосов
/ 29 декабря 2011

Ruby имеет концепцию, называемую binding , которую вы можете рассматривать как локальные переменные, значение self, block и т. Д., Которые может иметь кусок кода. Вы также можете рассматривать привязку как контекст кода.

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

x = 1
ERB.new('x=<%= x %>').result(binding) #=> "x=1"
1 голос
/ 29 декабря 2011

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

puts mysql_commands.result(binding)

Привязка содержит все ссылки на переменные в текущей области.

...