2010-04-26 7 views
17

Metoda escape_javascript w ActionView wymyka się apostrofowi ' jako ukośnik odwrotny apostrof \', który podaje błędy podczas analizowania jako JSON.Szyny escape_javascript tworzy nieprawidłowy JSON przez ucieczkę pojedynczych cudzysłowów

Na przykład komunikat "Jestem tutaj" jest poprawny JSON po wydrukowaniu jak:

{"message": "I'm here"} 

Ale <%= escape_javascript("I'm here") %> wyjść "I\'m here", co skutkuje nieprawidłowym JSON:

{"message": "I\'m here"} 

Czy istnieje łatka do naprawienia tego lub alternatywny sposób na ucieczkę ciągów podczas drukowania do JSON?

Odpowiedz

10

Po prostu wywołaj .to_json na ciągu znaków i zostanie odpowiednio zmieniony, np.

"foo'bar".to_json 
+1

To nie działa, jeśli łańcuch jest na przykład HTML i ma na przykład podwójne cudzysłowy w łańcuchu. – margusholland

+1

@margusholland - nie prawda - .to_json obsługuje unikalne podwójne cytaty idealnie – Neall

+0

'" foo'bar ".to_json' wychodzi' "foo'bar" ' –

3

Może potrzebować więcej szczegółów tutaj, ale ciągi JSON muszą używać podwójnych cudzysłowów. Pojedyncze cudzysłowy są w porządku w łańcuchach JavaScript, ale nie w JSON.

+0

Dzięki za odpowiedzi - dodałem przykład dla jasności. – Arrel

6

skończyło się na dodanie nowej metody escape_json do mojego application_helper.rb, oparta na metodzie escape_javascript znalezionego w ActionView::Helpers::JavaScriptHelper:

JSON_ESCAPE_MAP = { 
    '\\' => '\\\\', 
    '</' => '<\/', 
    "\r\n" => '\n', 
    "\n" => '\n', 
    "\r" => '\n', 
    '"'  => '\\"' } 

def escape_json(json) 
    json.gsub(/(\\|<\/|\r\n|[\n\r"])/) { JSON_ESCAPE_MAP[$1] } 
end 

ktoś zna lepsze niż to obejść?

+1

Nie wiem zbyt wiele o Railsach. Ale czy istnieje sposób, w jaki można użyć polecenia 'render: json', jak opisano na stronie http://guides.rubyonrails.org/layouts_and_rendering.html#rendering-json i http://api.rubyonrails.org/classes/ActionController/Base. html –

+0

To służy do konwertowania obiektów, ale nie ma pewności co do ciągów. Zajrzę do tego ... – Arrel

+0

Jedyne, co udało mi się znaleźć, to zadziałało. Nie wiem, dlaczego to_json postanawia uciec z cytatów z pojedynczym ukośnikiem zamiast podwójnego, ale to mnie przez jakiś czas. Dzięki. – dChimento

5

miałem pewne problemy podobne do tego, gdzie musiałem umieścić poleceń JavaScript w dolnej części szablonu szynach, co stawia pod jQuery.data struny do późniejszego wykorzystania i zastosowania.

Ilekroć miałam pojedynczy cytat w ciągu, otrzymywałam błąd JavaScript podczas ładowania strony.

Oto co zrobiłem:

-content_for :extra_javascript do 
    :javascript 
    $('#parent_#{parent.id}').data("jsonized_children", "#{escape_javascript(parent.jsonized_children)}"); 
Powiązane problemy