Строка JSON, созданная в Rails, заменяет пробел знаком плюс (+) - PullRequest
1 голос
/ 12 января 2012

Рельсы:

object = Object.find_by(params[:id])

object_items = { "1" => { :id => "123456", :name => "Pancakes Yum!" }, "2" => { :id => "789010", :name => "hello 123" }}

cookies[:something] = { "id" => object.id, "title" => object.title, "object_items" => object_items }.to_json

Допустим, что object.title создает строку "Hello World"

Содержание куки:

%7B%22id%22%3A2%2C%22title%22%3A%22Hello+World%22%2C%22object_items%22%3A%7B%221%22%3A%7B%22id%22%3A%22123456%22%2C%22name%22%3A%22Pancakes+Yum!%22%7D%2C%222%22%3A%7B%22id%22%3A%22789010%22%2C%22name%22%3A%22hello+123%22%7D%7D%7D

Задача

Созданная строка JSON заменяет / экранирует пробел знаком плюс (+) вместо %20, что означает, что если бы я прочитал строку и взял значение для object.title в HTML / JavaScript, он будет прочитайте его как «Hello + World», а не «Hello World», как ожидалось.

Кажется, что все другие символы заменены / экранированы правильно - это потому, что пробел существует внутри двойной кавычки? Я не могу понять, почему он производит эту строку как есть.

Ответы [ 4 ]

3 голосов
/ 13 января 2012

Я не понимаю, почему вы общаетесь с клиентом через куки. Почему бы не использовать действие контроллера и запрос ajax?

class SomethingController
  def show
    object = Object.find_by(params[:id])

    object_items = { "1" => { :id => "123456", :name => "Pancakes Yum!" }, "2" => { :id => "789010", :name => "hello 123" }}

    render :json => { "id" => object.id, "title" => object.title, "object_items" => object_items }
  end

Затем запросите его, используя jQuery или что-то вроде этого:

$.get('/something/1.json', function(results) { alert(results); });

Какой смысл использовать Rails, если вы не собираетесь использовать Rails?

Куки-файлы CGI экранируются перед отправкой клиенту. Когда клиент ретранслирует их, Rails удаляет их.

Вы можете проверить поведение следующим образом:

rails console c
CGI.escape("something something")
=> "something+something"
CGI.unescape("something+something")
=> "something something"
2 голосов
/ 12 января 2012

Похоже, что используется старая версия кодировки процентов:

http://en.wikipedia.org/wiki/Percent-encoding#The_application.2Fx-www-form-urlencoded_type

1 голос
/ 23 мая 2012

Поскольку содержимое файлов cookie использует CGI.escape в установщике, просто предварительно экранируйте их с помощью URI.escape, затем% 20 проходит через CGI.escape без изменений, и javascript может вернуть% 20 ​​обратно в пробел.

cookies[:snickerdoodle] = URI.escape("String With Spaces")
0 голосов
/ 06 марта 2012

У меня была похожая проблема, и я решил изменить cookie после назначения с заменой регулярного выражения:

response.headers['Set-Cookie'].gsub!(/\+/, '%20')
...