2011-10-18 17 views
7

私は.js.erbテンプレートを持っていると私はやっている:Rubyデータ構造を.js.erbを使用したjavascriptデータ構造に変換するにはどうすればよいですか?

var foo = <%= [1,2,3] %>; 
var foo2 = <%= [1,2,3].to_json %>; 
var foo3 = <%= ["bar"].to_json %>; 
var foo4 = <%= {:foo => "bar"}.to_json %>; 

fooが123の

foo2は等号[1,2,3]

foo3が定義されていないに等しい(ので、ブラウザで解析エラーが発生する)

foo4は未定義です(ブラウザで解析エラーが発生するため)

012私は仕事にfoo3を取得する方法を見つけ出すことができる唯一の方法が何をした

var foo4 = <%= "{:foo => 'bar'}.to_json" %>; # foo4 => "{&quot;foo:&quot;:&quot;bar&quot;}" %>; 
foo4.replace(/&quot;/g, "\""));    # => "{"foo":"bar"}" <-- looks like eval should work 
eval(foo4.replace(/&quot;/g, "\""));   # => "Parse error" <-- but it doesn't... 
を:

var foo3 = "<%= ['bar'].to_json %>"; # foo3 => "[&quot;bar&quot;]" 
foo3.replace(/&quot;/g, "\""))   # => "['bar']" <-- looks like eval should work... 
eval(foo3.replace(/&quot;/g, "\""))[0]; # => "bar" ... it works 

私はこのように動作するようにfoo4ことができませんでした...私はやってみました

ボトムライン、これはすべてevalのものを使う必要がありますばかげています - よりよい方法でなければなりません!誰かが私にそれが何であるか教えてもらえますか?

+2

foo.to_jsonは正しい方法です。 foo.to_jsonがjsソースでどのように変換されているか表示してください。 –

+0

私はvar foo = <%= [1,2,3] .to_json%>を実行すると動作します.. fooを検査するとjs配列[1,2,3] ...が表示されますが、var foo = [ "a"、 "b"、 "c"]。to_json%>ページを読み込むときに "Parse error"と表示され、fooは定義されていません。 – patrick

+0

追加情報を追加するには*あなたの質問を編集*してください。 Ruby js erbファイルの結果として、** Javascript **が何であるかを示してください。ブラウザ上で「解析エラー」と言っているだけです.JSファイルを調べることはできません。 –

答えて

20

問題が.to_json ecapesましたhtmlエンティティ!

解決策が何をした:

VAR FOO = <% = {:笑=> [ "lmaonade"、 "rotflcopter"]} to_json.html_safe}%>

これは私を与えます。:

{"lol": ["lmaonade", "rotflcopter"]} 
+1

これはHTMLエンティティをエスケープするのではなく、それはそうする。そして、そうです.to_htmlは、(私が、時には<%= raw {:lol => ["lmaonade"、 "rotflcopter"]}のようにrawを使うことを好みますが。 – radiospiel

0

あなたは@fooがnilのときに処理する必要がある場合は、これを試してみてください。

var foo = <%= (@foo.kind_of?(Array) ? $foo : []).to_json %>; 

はJavascriptオブジェクトにRubyのハッシュの変換は次のように行われます。

<% hash = {:foo=>'bar'} %> 
var js_hash = <%= hash.to_json %>; 
+0

'if'の代わりに配列をスプラットで囲むだけでいいです: 'var foo = <%@ [* @ foo] .to_json%>;' – rewritten

関連する問題