Rails - 将JSON从视图传递到控制器

时间:2016-06-11 23:51:09

标签: ruby-on-rails ruby json

在我的Rails应用程序中,我想将Javscript数组传递给new动作控制器 - 该数组是从其他视图中的用户输入创建的,由JSON组成。什么是最好的方法:a)将JSON数组传递给控制器​​,b)解析控制器中的数组,以便我可以做一些事情,比如获取数组长度,将JSON渲染到new视图中,等?

正如我已经构建它,该应用程序工作正常,但我可以看到,我做事情的方式将导致问题,因为我继续开发它。

目前,我的动作控制器如下所示:

def new

    x = Integer(params[:total_inserts_param])

    @report_group = Array.new
    x.times do
      @report_group.push(Report.new)
    end
end

其中total_inserts_param是在前面的视图中计算并通过URL传入的数组长度的计数,而JSON的实际内容是通过字符串化的localStorage对象在视图之间传递的;解析出这些对象的内容,并将其插入到控制器生成的new视图中的可变数量的表单输入字段中。这当然是传递Rails应用程序数据的一种方法,但我很确定这不是一个很好的方法!

我更愿意将数组放入控制器,为数组中的每个JSON生成Report.new,然后使用JSON的属性填充控制器创建的输入字段。

我对Rails相当陌生,因此非常感谢任何有关如何处理此问题的见解。

1 个答案:

答案 0 :(得分:0)

  

的最佳方法是什么?      

a)将JSON数组传递给控制器​​,

     

该数组是从其他一个视图中的用户输入创建的,

为什么不将该表单提交给目标操作,然后使用ruby将数据组合成数组?如果这不是一个选项,您可以使用javascript向rails应用程序发送ajax请求。这里是使用coffeescript和jquery:

window.my_func = () ->  #`window` is needed if you call the function from another file  

  array = [1, 2, 3]
  text = JSON.stringify { my_array: array }

  ajax_settings = 
    type: "post",
    url: 'http://localhost:3000/dogs/dostuff', 
    data: text,  
    contentType: "application/json",
    success: (response) -> 
        $("#result").html(response)

  $.ajax(ajax_settings)

当你编写jquery代码时,有很多讨厌的大括号和括号,你应该考虑使用coffeescript:

coffee script syntax
coffee script syntax and jquery

coffeescript会在你的app / assets / javascript / controller_name.js.coffee文件中找到,该文件在创建控制器时由rails自动创建。在我的例子中,我使用了名为DogsController的控制器,因此coffeescript文件是app / assets / javascript / dogs.js.coffee。

然后,在application.html.erb布局中,您将包含rails从所有单个js文件创建的一个大缩小js文件,如下所示:

<!DOCTYPE html>
<html>
<head>
  <meta charset="ISO-8859-1">
  <title>Restauranteur</title>
  <%= stylesheet_link_tag    "application", media: "all" %>
  <%= javascript_include_tag "application" %>  <**** HERE *****
  <%= csrf_meta_tags %>
</head>
<body>

<p class="notice"><%= notice %></p>
<p class="alert"><%= alert %></p>

<div>Application Layout</div>

<div>
  <%= yield %>
</div>

<%= debug params %>
<%= debug session[:allowed] %>
</body>
</html>

要在您的某个观看中致电my_func(),您只需要写:

<script>
my_func();
</script>
  

b)解析控制器中的数组,以便我可以执行get等操作   数组长度

Ruby有一个标准的库模块,用于将JSON文本转换为ruby哈希,以便您可以轻松地检索数据:

http://ruby-doc.org/stdlib-2.3.1/libdoc/json/rdoc/JSON.html#method-c-5B-5D

然而,在你的rails应用程序中,你甚至不需要编写任何代码来将JSON文本转换为哈希:如果你指定contentType"application/json",则在你的jquery ajax请求中然后rails会自动将请求中的JSON文本转换为哈希,这将在params中提供:

{"my_array"=>[1, 2, 3], "controller"=>"dogs", "action"=>"dostuff", "dog"=>{}}