我发现在我的控制器中使用JSON.parse()
解析从(Firefox)浏览器发送的JSON字符串时出错的解决方法,但是没有更好的解决方案吗?
rails 2.3.12
json(1.6.1)
views/theme_maps/edit.html.erb
:
(JavaScript的)
var labels = ["4", "5"];
document.getElementById("labels").value = JSON.stringify(labels);
(HTML)
<% form_for(@theme_map}) do |f| %>
<input type="hidden" id='labels' name='labels' />
<%= f.submit 'Update' %>
<% end %>
theme_maps_controller#update
:
(红宝石)
labels = params[:labels] # get it from the hidden field
# labels.inspect returns: "\"[\\\"4\\\", \\\"5\\\"]\""
# JSON.parse(labels) throws an exception.
labels.gsub!('"[', '[') # remove the quotes
labels.gsub!(']"', ']') # around the brackets.
labels.gsub!('\\', '') # remove the escaped backslash.
# now labels.inspect returns: "[\"4\", \"5\"]"
labels_array = JSON.parse(labels)
# now it's happy.
只是为了解决问题,因为我花了很长时间才弄清楚这一点:
theme_maps_controller#edit
:
(红宝石)
label_list = ["1", "2","3"]
@json_labels = label_list.to_json
views/theme_maps/edit.html.erb
:
(JavaScript的)
var exist_labels = <%= @json_labels %>;
答案 0 :(得分:1)
看起来目标是在服务器上接收类似这样的内容:
params[:labels] # ["1", "4", "5"]
老实说,你应该在这里挑选一个哑剧型并坚持下去。如果您愿意使用实际的JSON数据发布(例如,通过AJAX调用),那么您提交的数据将无需服务器端更改即可,如下所示:
{labels: ["1", "4", "5"]}
但是,如果您要提交表单数据,则您的请求应如下所示:
labels=1&labels=4&labels=5
同样,无需服务器端更改即可正确解释。
TLDR:不要尝试对填充到表单字段中的JSON字符串进行编码和解码,它在客户端或服务器上没有多大意义。
答案 1 :(得分:0)
问题是使用JSON.stringify()
。我们需要的是.toSource()
。
var labels = ["4", "5"];
// document.getElementById("labels").value = JSON.stringify(labels);
document.getElementById("labels").value = labels.toSource();