2011-12-29 3 views
0

erb erbテンプレートで使用される変数がグローバル変数でない限り、undefined local variable or method for main:Object (NameError)を返します。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

のようなものを行うことができますので

エルブresult方法は、あなたがそれを与えるコードを評価するためにどのと結合され、オプションの第二の方法を取ります実際にERBテンプレートをどこで実行しますか?テンプレート上で '#result'が呼び出されるまでは何も起こらず、渡されるべき呼び出し元のバインディング(すべての変数参照を含みます)が必要です。 – d11wtq

+0

あなたのコードが何をしているのか分かりません。説明は私の答えを参照してください;) – d11wtq

答えて

7

Rubyにはbindingという概念があります。これはローカル変数、自己価値、ブロックなどが考えられるかもしれません。バインディングはコードのコンテキストと考えることもできます。あなたは完全なスタックトレースとコードの行を持っていますか

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

良い説明。今はうまくいきます。 – Radek

1

あなたは、呼び出し元の結合に渡していない、とあなたは次のようになります。

puts mysql_commands.result(binding) 

結合は、すべての変数の参照が含まれています現在のスコープでは

関連する問題