使用JSON在浏览器和控制器之间来回传递值

Passing Values Back and Forth from Browser to Controller Using JSON

本文关键字:之间 控制器 JSON 浏览器 使用      更新时间:2023-09-26

我在控制器中使用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:

(ruby)

  labels = params[:labels]     # get it from the hidden field  

的问题,我的hack解决方案,在这里:

  #   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:
(ruby)

  label_list = ["1", "2","3"]
  @json_labels = label_list.to_json  

views/theme_maps/edit.html.erb:

(javascript)

  var exist_labels = <%= @json_labels %>;

看起来目标是在服务器上接收如下内容:

params[:labels]     # ["1", "4", "5"]

老实说,你应该在这里选择一个mime类型并坚持使用它。如果您愿意使用实际的JSON数据发布(例如,通过AJAX调用),那么您提交的数据将无需服务器端更改即可工作,并且看起来像这样:

{labels: ["1", "4", "5"]}

如果你正在提交表单数据,那么你的请求应该是这样的:

labels=1&labels=4&labels=5

同样,这将被正确解释,而不需要更改服务器端。

TLDR:不要尝试编码和解码填充到表单字段中的JSON字符串,这在客户端或服务器上没有多大意义。

问题是使用JSON.stringify()。我们需要的是.toSource()

var labels = ["4", "5"];
// document.getElementById("labels").value = JSON.stringify(labels);
document.getElementById("labels").value = labels.toSource();