2011-10-18 28 views
7

Tôi có một mẫu .js.erb và tôi đang làm:làm thế nào tôi có thể chuyển đổi cấu trúc dữ liệu ruby ​​thành cấu trúc dữ liệu javascript bằng .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 bằng 123

foo2 bằng [1,2,3]

foo3 là ​​undefined (vì trình duyệt than phiền về lỗi phân tích cú pháp)

foo4 không xác định (vì trình duyệt than phiền lỗi phân tích cú pháp)


Cách duy nhất tôi có thể tìm ra cách để có được foo3 làm việc đã làm:

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 

tôi không thể foo4 để làm việc theo cách này ... Tôi đã cố gắng thực hiện:

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

Tóm lại, tất cả điều này cần phải sử dụng công cụ đánh giá là vô lý-- có PHẢI là một cách tốt hơn! Ai đó có thể vui lòng khai sáng cho tôi xem nó là gì không?!?!

+2

foo.to_json là đúng cách. Vui lòng cho chúng tôi biết foo.to_json đang được chuyển đổi thành nguồn js nào. –

+0

Nếu tôi làm var foo = <% = [1,2,3] .to_json%>, nó hoạt động .. Kiểm tra foo hiển thị một mảng js [1,2,3] ... nhưng nếu tôi làm var foo = [ "a", "b", "c"]. to_json%> nó nói "Lỗi phân tích cú pháp" khi tôi tải trang và foo không được xác định. – patrick

+0

Vui lòng * chỉnh sửa * câu hỏi của bạn để thêm thông tin bổ sung. Và cho chúng tôi thấy ** Javascript ** là kết quả của tệp js erb Ruby. Bạn chỉ đang nói cho chúng tôi "lỗi phân tích cú pháp" trên trình duyệt - chúng tôi muốn xem * những gì * không thể được phân tích cú pháp - hãy xem tệp js. –

Trả lời

20

Vấn đề là ecapes .to_json các thực thể html!

Giải pháp là phải làm:

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

này mang lại cho tôi:

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

Vâng, nó không phải là .to_json thoát các thực thể html, nó là erb điều đó. Và có, .to_html là con đường để đi (mặc dù đôi khi tôi thích sử dụng thô hơn, như trong <% = raw {: lol => ["lmaonade", "rotflcopter"]}. To_json}%> – radiospiel

0

Nếu bạn cần để xử lý khi @foo là con số không, hãy thử này:

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

Chuyển đổi một băm Ruby để một đối tượng Javascript được thực hiện như thế này:

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

Thay vì 'nếu' bạn chỉ có thể tách bọc trong một mảng: 'var foo = <% = [* @ foo] .to_json%>;' – rewritten

Các vấn đề liên quan