1

我有一个数组,其中包含一些在 Javascript 中动态生成的参数。填写一些字段并按下提交后,我想在 DB 中生成多条记录,其中包含来自表单字段的数据 + 来自数组的数据,即 name,array[0];name,array[1];name,array[2] 等。所以我决定做以下事情:在我看来(我使用simpleform)

<%= simple_form_for(@stop_time, :html => {:remote => true, :class => 'well form-horizontal'}) do |f| %>
<%= f.input :stop_id %>
<%= f.button :submit %>

和脚本部分(我现在使用固定值):

<script type="text/javascript">
$('#new_stop_time').submit(function(){
  $.ajax({
    beforeSend: function(xhr) {
      xhr.setRequestHeader(
        'X-CSRF-Token', 
        $('meta[name="csrf-token"]').attr('content'))},
    url: "/stop_times.json",
    type: "POST",
    contentType: "application/json",
    data: JSON.stringify([
      arrival_time:"04:40:00",
      created_at:"2013-04-20T20:37:30Z",
      departure_time:"04:40:00",
      drop_off_type:0,
      id:1881,
      pickup_type:0,
      shape_dist_traveled:null,
      stop_headsign:null,
      stop_id:84612,
      stop_sequence:1,
      trip_id:"ABCDE",
      updated_at:"2013-04-20T20:37:30Z"
    ]
    ]})
  });
});  

但在 chrome 调试中,我看到发送了 2 个 POST 请求(一个来自表单的 /stoptimes 和其他 /stop_times.json 得到代码 422 的响应)。

不应该只是一个 POST 请求吗?我希望 Javascript 做 POST 而不是表单。有没有其他(更明显的)方法来创建多个记录?

谢谢,

多米尼克

谢谢@UberNeet :) 现在它适用于一条记录。它传递给控制器​​并创建正确的记录。我可以创建整个数组以将其作为 JSON 传递,但不确定如何在控制器端处理它。我假设需要一些循环,但我不知道参数是如何构建的。我添加了以下内容:

@i = 0 
while @i< params.length-1 do
  @stop_time = StopTime.new(params[@i][:stop_time])
  @i +=1
end 
4

1 回答 1

1

该表单发布了两次,因为您将表单标记为:remote => true并添加您的自定义 AJAX 帖子。

当您将表单标记为:remote => true时,Rails 不显眼的 javascript 库会启动并向表单添加事件处理程序。(更多信息@“在 Rails 中使用 Javascript”[http://edgeguides.rubyonrails.org/working_with_javascript_in_rails.html] 请注意,这是针对 Rails 4 的)

不要将表单标记为:remote => true,并且在 ajax 的自定义函数中,确保为提交返回 false。

$('#new_stop_time').submit(function () {
  $.ajax({ ... });
  return false;
});

返回 false 将取消常规的表单提交。

如果要使用 AJAX 创建多个记录,则需要在 Ajax 方法中传递项目数组,并且控制器操作还必须支持处理该数据。将您的 Rails 操作视为 API。

于 2013-07-09T15:07:21.383 回答