erb выдает мне - неопределенная локальная переменная или метод для main:Object (NameError)

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

Это правильно? на ruby ​​1.8.7 (уровень обновления 249 от 10 января 2010 г.) [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

person Radek    schedule 29.12.2011    source источник
comment
Есть ли у вас полная трассировка стека и строка кода, в которой вы фактически выполняете шаблон ERB? Ничего не должно происходить до тех пор, пока в шаблоне не будет вызвана функция #result, которая требует передачи привязки вызывающего объекта (которая содержит все ссылки на переменные).   -  person d11wtq    schedule 29.12.2011
comment
Не обращайте внимания, я видел, что делал ваш код. Смотрите мой ответ для объяснения;)   -  person d11wtq    schedule 29.12.2011


Ответы (2)


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

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

x = 1
ERB.new('x=<%= x %>').result(binding) #=> "x=1"
person Frederick Cheung    schedule 29.12.2011
comment
Хорошее объяснение. Теперь работает хорошо. - person Radek; 29.12.2011

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

puts mysql_commands.result(binding)

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

person d11wtq    schedule 29.12.2011