2011-12-29 2 views
0

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

Это правильно? on 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 
+0

У вас есть полный трассировки стека и строки кода где вы фактически выполняете шаблон ERB? Ничего не должно произойти до тех пор, пока в шаблоне не будет вызван «# result», что требует связывания вызывающего объекта (в котором содержатся все ссылки на переменные). – d11wtq

+0

Игнорируйте это, я увидел, что делает ваш код. См. Мой ответ для объяснения;) – d11wtq

ответ

7

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

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

x = 1 
ERB.new('x=<%= x %>').result(binding) #=> "x=1" 
+0

Хорошее объяснение. Прекрасно работает. – Radek

1

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

puts mysql_commands.result(binding) 

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

 Смежные вопросы

  • Нет связанных вопросов^_^