2012-03-13 27 views
11

Tôi đã thử mọi thứ. Mọi kết hợp của những người trợ giúp raw, html_safeto_json bao gồm một số lần thử với ::JSON.encodeCGI.unescape. Vấn đề là bất kể tôi làm gì, tôi không thể in JSON được định dạng tốt trong một chế độ xem. Nó luôn luôn HTML thoát.In JSON hợp lệ, không thoát được trong chế độ xem với Rails

Dưới đây là mã trong quan điểm của tôi:

var campaignData<%= "=" + (raw @campaign.to_json) if @campaign %>;

Trong trường hợp của tôi, nó luôn luôn có dấu ngoặc kép được thoát như ". Tôi sẽ chỉ làm một gsub trên báo giá, nhưng đó là một giải pháp khủng khiếp cho những gì IMO phải là một trường hợp sử dụng rất đơn giản, tài liệu.

Trả lời

30

Vấn đề ở đây là với "=" string. Vì nó được coi là không an toàn, nó taints chuỗi khác.

Bạn có lẽ có thể làm một trong hai:

raw("=" + @campaign.to_json) 

hoặc

"= #{@campaign.to_json}".html_safe 

đó là gần như nhau.

+1

Điều này không an toàn. Điều gì sẽ xảy ra nếu json chứa một chuỗi có ít hơn? Nếu bạn đặt thẻ này vào thẻ tập lệnh, ai đó có thể tiêm thẻ đóng tập lệnh và bắt đầu một thẻ mới có mã tùy ý. Bạn cần bọc chuỗi json trong 'json_escape'. Tuy nhiên, chức năng đó đã bị hỏng cho đến gần đây (đường ray 4.1). – Kelvin

+0

Có, tôi cũng thấy rằng điều này không hiệu quả đối với tôi khi @campaign == "" – hrdwdmrbl

+0

THANKS A TON !!! –

5

Bạn đã thử escape_javascript?

Đây là ví dụ từ tệp * .haml, mà tôi vừa thêm vào để kiểm tra câu trả lời của mình.

:javascript 
    var foo=$.parseJSON("#{j @albums.to_json}") 

Trường hợp j là một bí danh ngắn cho escape_javascript.

+0

Yea, điều đó không hiệu quả. Ngay bây giờ tôi chỉ tự in mỗi giá trị mà tôi cần, đó là một giải pháp khủng khiếp, nhưng cách duy nhất tôi đã có thể làm cho nó hoạt động. –

+0

Bạn có thể dán vào đây một chút chuỗi thoát của bạn không? Ngoài ra, bạn sử dụng phiên bản ruby ​​và đường ray nào? Chỉ cần tự hỏi điều gì có thể sai với điều đó – cutalion

+0

Đó là JSON hợp lệ, ngoại trừ các dấu ngoặc kép được thay thế bằng thực thể trích dẫn HTML '" 'Sử dụng Rails 3.2.1 –

0

Hãy thử điều này với utility method

var campaignData<%=h " =#{raw @campaign.to_json}" if @campaign %>; 
9

Vì ActiveSupport 2.3.3 bạn đã có thể làm .as_json

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