2011-10-18 14 views
7

Mam .js.erb szablon i robie:Jak mogę przekonwertować struktury danych ruby ​​na struktury danych javascript za pomocą .js.erb?

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

foo równa 123

foo2 równa [1,2,3]

foo3 jest niezdefiniowane (bo przeglądarka narzeka na błąd parsowania)

foo4 jest niezdefiniowany (ponieważ przeglądarka narzeka na błąd analizy)


Jedyny sposób mogę dowiedzieć się, jak dostać foo3 do pracy było zrobić:

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 

nie mogłem foo4 pracować w ten sposób ... Próbowałem robić:

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... 

Podsumowując, wszystko to, co wymaga użycia ewaluacji, jest śmieszne - MUSI być lepszy! Czy ktoś może mnie oświecić, co to jest?!?!

+2

foo.to_json jest właściwą drogą. Pokaż nam, do czego konwertuje foo.to_json w źródle js. –

+0

Jeśli robię var foo = <% = [1,2,3] .to_json%>, działa. Sprawdzanie foo pokazuje tablicę js [1,2,3] ... ale jeśli robię var foo = [ "a", "b", "c"]. to_json%> komunikat "Błąd analizy", gdy ładuję stronę, a foo jest niezdefiniowana. – patrick

+0

Proszę * edytować * swoje pytanie, aby dodać dodatkowe informacje. Pokaż nam, co jest ** Javascript ** w wyniku pliku erb Ruby js. Po prostu mówisz nam "błąd parsowania" w przeglądarce - chcemy zobaczyć * czego * nie można przeanalizować - zajrzyj do pliku js. –

Odpowiedz

20

Problemem było .to_json ecapes encje html!

Roztwór należy zrobić:

var xxx = <%;. {: Lol => [ "lmaonade", "rotflcopter"]} to_json.html_safe}%>

To daje:

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

Cóż, to nie jest .to_json uciekające z encji html, to jest erb co to robi. I tak, .to_html jest drogą do przejścia (nawet jeśli czasami wolę używać surowca, jak w <% = raw {: lol => ["lmaonade", "rotflcopter"]}. To_json}%> – radiospiel

0

Jeśli trzeba obsłużyć gdy @foo jest zerowa, spróbuj tego:

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

Konwersja hash Ruby do obiektu JavaScript jest zrobione tak:

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

Zamiast "if" można po prostu splat-wrap w tablicy: 'var foo = <% = [* @ foo] .to_json%>;' – rewritten

Powiązane problemy