【问题标题】:Rails AJAX form submission succeeds, but nothing happens on pageRails AJAX 表单提交成功,但页面没有任何反应
【发布时间】:2016-06-12 18:44:58
【问题描述】:

我正在尝试修改 Rails 待办事项列表应用程序中的表单以使用 AJAX 而不是 HTML。我已经获得了要在后端提交的表单,但在前端,页面什么也不做。提交后,我想通过 AJAX 显示列表。

这是我的表格 – app/views/lists/_form.html.erb:

<%= form_for(@list, remote: true) do |f| %>
  <% if @list.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@list.errors.count, "error") %> prohibited this list from being saved:</h2>

      <ul>
      <% @list.errors.full_messages.each do |message| %>
        <li><%= message %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= f.label :name %><br>
    <%= f.text_field :name %>
  </div>

  <%= f.fields_for :tasks do |task| %>
    <li>
      <%= task.label :name %>       <%= task.text_field :name %>
      <%= task.label :due %>        <%= task.datetime_select :due, ampm: true %>
      <%= task.label :completed %>  <%= task.check_box :completed %>
    </li>
  <% end %>

  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

这是呈现表单的页面的 CoffeeScript – app/assets/javascripts/lists.coffee:

$(document).ready ->
  $("new_list").on("ajax:success", (e, data, status, xhr) ->
    $("new_list").append xhr.responseText
  ).on "ajax:error", (e, xhr, status, error) ->
    $("new_list").append "<p>Error!</p>"

在后端提交表单成功...

Started POST "/lists" for ::1 at 2016-06-12 14:28:43 -0400
Processing by ListsController#create as JS
  Parameters: {"utf8"=>"✓", "list"=>{"name"=>"Groceries", "tasks_attributes"=>{"0"=>{"name"=>"Apples", "due(1i)"=>"2016", "due(2i)"=>"6", "due(3i)"=>"12", "due(4i)"=>"18", "due(5i)"=>"28", "completed"=>"0"}, "1"=>{"name"=>"Bananas", "due(1i)"=>"2016", "due(2i)"=>"6", "due(3i)"=>"12", "due(4i)"=>"18", "due(5i)"=>"28", "completed"=>"0"}, "2"=>{"name"=>"Oranges", "due(1i)"=>"2016", "due(2i)"=>"6", "due(3i)"=>"12", "due(4i)"=>"18", "due(5i)"=>"28", "completed"=>"0"}}}, "commit"=>"Create List"}
  User Load (4.7ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1  ORDER BY "users"."id" ASC LIMIT 1  [["id", 1]]
   (0.3ms)  BEGIN
  SQL (0.8ms)  INSERT INTO "lists" ("name", "user_id", "created_at", "updated_at") VALUES ($1, $2, $3, $4) RETURNING "id"  [["name", "Groceries"], ["user_id", 1], ["created_at", "2016-06-12 18:28:43.050750"], ["updated_at", "2016-06-12 18:28:43.050750"]]
  SQL (0.7ms)  INSERT INTO "tasks" ("name", "completed", "due", "list_id", "created_at", "updated_at") VALUES ($1, $2, $3, $4, $5, $6) RETURNING "id"  [["name", "Apples"], ["completed", "f"], ["due", "2016-06-12 18:28:00.000000"], ["list_id", 22], ["created_at", "2016-06-12 18:28:43.055160"], ["updated_at", "2016-06-12 18:28:43.055160"]]
  SQL (0.7ms)  INSERT INTO "tasks" ("name", "completed", "due", "list_id", "created_at", "updated_at") VALUES ($1, $2, $3, $4, $5, $6) RETURNING "id"  [["name", "Bananas"], ["completed", "f"], ["due", "2016-06-12 18:28:00.000000"], ["list_id", 22], ["created_at", "2016-06-12 18:28:43.058809"], ["updated_at", "2016-06-12 18:28:43.058809"]]
  SQL (0.4ms)  INSERT INTO "tasks" ("name", "completed", "due", "list_id", "created_at", "updated_at") VALUES ($1, $2, $3, $4, $5, $6) RETURNING "id"  [["name", "Oranges"], ["completed", "f"], ["due", "2016-06-12 18:28:00.000000"], ["list_id", 22], ["created_at", "2016-06-12 18:28:43.061804"], ["updated_at", "2016-06-12 18:28:43.061804"]]
   (4.4ms)  COMMIT
Redirected to http://localhost:3000/lists/22
Completed 302 Found in 42ms (ActiveRecord: 12.1ms)

Started GET "/lists/22" for ::1 at 2016-06-12 14:28:43 -0400
Processing by ListsController#show as JS
  Parameters: {"id"=>"22"}
  List Load (0.6ms)  SELECT  "lists".* FROM "lists" WHERE "lists"."id" = $1 LIMIT 1  [["id", 22]]
  User Load (0.4ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1  ORDER BY "users"."id" ASC LIMIT 1  [["id", 1]]
  Task Load (0.9ms)  SELECT "tasks".* FROM "tasks" WHERE "tasks"."list_id" = $1  [["list_id", 22]]
  Rendered lists/show.html.erb within layouts/application (4.9ms)
  Rendered application/_nav.html.erb (0.5ms)
Completed 200 OK in 418ms (Views: 411.3ms | ActiveRecord: 1.8ms)

...但是页面上什么也没有发生。如何通过 AJAX 将新创建的列表加载到页面中?

为代码墙道歉,感谢您的帮助!

更新:我能够让新创建的列表呈现在页面上,但它出现在现有页面内容的下方。我为保存的列表更改了format.json

respond_to do |format|
  if @list.save
    format.html { redirect_to @list, notice: 'List was successfully created.' }
    format.json { render json: @list.to_json }
  else
    format.html { render :new }
    format.json { render json: @list.errors, status: :unprocessable_entity }
  end

【问题讨论】:

  • 添加了重定向后执行的show 操作的详细信息;这实际上并没有显示在页面上。
  • 我能够在页面上呈现新创建的列表,但它出现在现有页面内容的下方。详情见上。

标签: javascript jquery ruby-on-rails ajax coffeescript


【解决方案1】:

$("new_list") 正在寻找很可能不存在的标签 &lt;new_list&gt;

从显示的代码中不清楚它所引用的内容,所以如果它是带有 # 的 id 前缀选择器,并且它是带有 . 的类前缀

也不清楚表单提交是如何工作的

【讨论】:

  • 好电话。我已将 $("new_list") 更改为 $("#new_list") 以匹配表单的选择器,但它仍然无法正常工作。您发现表单提交机制具体是什么?很高兴根据需要添加更多详细信息。谢谢!
  • 表单是否通过 ajax 提交?还是页面在提交时重新加载?还要确保使用document.ready
  • 表单通过AJAX提交;页面不会重新加载。我正在使用document.ready,如上面的代码 sn-p 所示。
猜你喜欢
  • 1970-01-01
  • 2012-05-07
  • 1970-01-01
  • 1970-01-01
  • 2016-09-27
  • 2013-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多