滑轨:
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”。
所有其他角色似乎都被正确替换/转义 - 是因为空间存在于双引号内?我无法弄清楚为什么它会生成这个字符串。
答案 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)
好像它正在使用旧版本的百分比编码:
http://en.wikipedia.org/wiki/Percent-encoding#The_application.2Fx-www-form-urlencoded_type
答案 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')