使用JSON将值从浏览器传回到控制器

时间:2011-10-01 21:59:22

标签: javascript ruby-on-rails

我发现在我的控制器中使用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. 

控制器 - &gt;图


只是为了解决问题,因为我花了很长时间才弄清楚这一点:

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 %>;

2 个答案:

答案 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();