Разбор строки JSON в Rails из Cookie, сгенерированного JavaScript - PullRequest
7 голосов
/ 21 ноября 2011

Я пытаюсь проанализировать строку JSON, которая хранится в значении cookie, которое вызывает мой код Rails.

Rails может читать строку до запятой (','), которая разделяетдве разные пары ключ: значение в строке.

JavaScript:

var value1 = "v1";
var value2 = "v2";
var obj = { key1: value1, key2: value2 };
document.cookie = "cookiename="+JSON.stringify(obj);

Cookie:

Name: cookiename
Content: {"key1":v1,"key2":v2}

Rails:

@cookievalue = cookies[:cookiename]

Railsпри вызове @cookievalue в erb <% = @cookievalue%> оценивает его следующим образом:

{"key1":v1

что-либо после запятой (','), которое разделяет ключ1: v1, ключ2: v2 отсутствует.

Есть идеи?

Я попробовал это как простой текст, и он делает то же самое с первой запятой, с которой встречается.

ОБНОВЛЕНО Ответил на мой собственный вопрос ниже- необходимо экранировать запятую, разделяющую значения, используя encode () в JS.

1 Ответ

7 голосов
/ 22 ноября 2011

Запятая не является допустимым символом (я явно перебрал это), и поэтому он отбрасывал все после него.

ОБНОВЛЕНО ИСПРАВЛЕНО :

добавил код JavaScript () в JavaScript:

document.cookie = "cookiename="+encodeURIComponent(JSON.stringify(obj));

Это правильно экранирует символы и правильно передает строку в формате JSON на мой сервер. Также используется encodeURIComponent () вместо encode () из-за того, что азиатские или азиатские символы не кодируются должным образом с помощью encode ().

Изменение на стороне сервера (необязательно):

@cookievalue = JSON.parse(cookies[:cookiename])

Это позволяет мне немного легче разобрать строку JSON после извлечения из cookie [: cookiename]

Предыдущее исправление:

добавил кодирование () в JavaScript:

document.cookie = "cookiename="+encode(JSON.stringify(obj));
...