在Rails中创建的JSON字符串用加号(+)替换空格

时间:2012-01-12 18:46:07

标签: javascript ruby-on-rails json cookies whitespace

滑轨:

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”

Cookie内容:

%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 个答案:

答案 0 :(得分:3)

我不明白你为什么要通过cookies与客户沟通。为什么不使用控制器操作和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会有什么意义?

Cookie会在发送给客户端之前进行CGI转义。当客户端重新发送它们时,Rails会使它们无效。

你可以测试这样的行为:

rails console c
CGI.escape("something something")
=> "something+something"
CGI.unescape("something+something")
=> "something something"

答案 1 :(得分:2)

答案 2 :(得分:1)

由于cookie内容在setter中使用CGI.escape,只需使用URI.escape预先转义它们,然后%20通过CGI.escape不变,javascript可以将%20转移回空格。

cookies[:snickerdoodle] = URI.escape("String With Spaces")

答案 3 :(得分:-1)

我遇到了类似的问题并解决了使用正则表达式替换后更改cookie的问题:

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