javascript - Rails 应用程序中的 Ajax 按钮不再更新

标签 javascript jquery ruby-on-rails ajax

我实现了 Michael Hartl 的 Rails 教程中的“跟随”功能。它工作了好几个月,但现在突然按钮一旦退出就不再更新。我没有收到任何 Javascript 错误,Rails 控制台中也没有收到任何错误。点击该按钮将成功创建/销毁“关系”。当我尝试再次单击该按钮时,我只会在 Rails 控制台中收到错误,因为它正在尝试重做事务。

我确实预编译了我的 Assets ,但这从来都不是问题。我总是预编译我的 Assets 并将应用程序推送到 Heroku,按钮工作正常。我最近实现的唯一更改是添加了 simple_form 和 haml-rails gem,以便使邮箱程序 gem 正常工作。我不确定它们是否相关,但我认为这可能有助于调试。

这是怎么坏的?我该如何修复它?谢谢!

相关代码:

Controller :

class RelationshipsController < ApplicationController

  def create
    @user = User.find(params[:relationship][:followed_id])
    current_user.follow!(@user)
   respond_to do |format|
      format.html { redirect_to @user }
      format.js
    end
  end

  def destroy
    @user = Relationship.find(params[:id]).followed
    current_user.unfollow!(@user)
    respond_to do |format|
      format.html { redirect_to @user }
      format.js
    end
  end
end

按照表格

<% unless current_user == @user %>
  <% if current_user.following?(@user) %>
    <%= render 'unfollow' %>
  <% else %>
    <%= render 'follow' %>
  <% end %>

关注

<%= form_for(current_user.relationships.build(followed_id: @user.id),
             remote: true) do |f| %>
  <div><%= f.hidden_field :followed_id %></div>
<%= f.submit "Follow", class: "btn btn-primary btn-small" %>
<% end %>

取消关注

<%= form_for(current_user.relationships.find_by_followed_id(@user),
             html: { method: :delete },
             remote: true) do |f| %>
<%= f.submit "Unfollow", class: "btn btn-primary btn-small" %>
<% end %>

创建.js.erb

$("#follow_form").html("<%= escape_javascript(render('users/unfollow')) %>")
$("#followers").html('<%= @user.followers.count %>')

销毁.js.erb

$("#follow_form").html("<%= escape_javascript(render('users/follow')) %>")
$("#followers").html('<%= @user.followers.count %>')

application.js

// This is a manifest file that'll be compiled into application.js, which will include all the files
// listed below.
//
// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
// or vendor/assets/javascripts of plugins, if any, can be referenced here using a relative path.
//
// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
// the compiled file.
//
// WARNING: THE FIRST BLANK LINE MARKS THE END OF WHAT'S TO BE PROCESSED, ANY BLANK LINE SHOULD
// GO AFTER THE REQUIRES BELOW.

//= require bootstrap
//= require jquery
//= require jquery-ui
//= require jquery.tokeninput
//= require_tree .

我曾经在 application.js 中有 //= require jquery_ujs 但我必须将其删除,因为单击“Follow”按钮会导致单击发生两次。删除该行解决了该问题,但 Ajax 似乎不再更新按钮,我不明白为什么。

编辑:

Rails 控制台确实显示正在接收请求。我什至可以刷新页面,然后按钮就会更新:

Started DELETE "/relationships/32" for 127.0.0.1 at 2014-01-13 21:35:37 -0500
Processing by RelationshipsController#destroy as JS
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"---edited---", "commit"=>"Unfollow", "id"=>"32"}
  Relationship Load (0.4ms)  SELECT "relationships".* FROM "relationships" WHERE "relationships"."id" = $1 LIMIT 1  [["id", "32"]]
  User Load (0.4ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 2 LIMIT 1
  User Load (0.4ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 1 LIMIT 1
  Relationship Load (0.4ms)  SELECT "relationships".* FROM "relationships" WHERE "relationships"."follower_id" = 1 AND "relationships"."followed_id" = 2 LIMIT 1
   (0.1ms)  BEGIN
  SQL (0.3ms)  DELETE FROM "relationships" WHERE "relationships"."id" = $1  [["id", 32]]
   (1.5ms)  COMMIT
  Rendered users/_follow.html.erb (2.5ms)
   (0.7ms)  SELECT COUNT(*) FROM "users" INNER JOIN "relationships" ON "users"."id" = "relationships"."follower_id" WHERE "relationships"."followed_id" = 2
  Rendered relationships/destroy.js.erb (6.0ms)
Completed 200 OK in 17.4ms (Views: 8.0ms | ActiveRecord: 4.2ms)

Chrome 中的 Javascript 控制台根本不显示任何错误。

编辑2 我的网络选项卡:

Network tab in Chrome Javascript console

最佳答案

如果你的create.js.erb工作(根据你的警报),问题将出在你的JS的渲染上

这是您当前的create.js.erb:

$("#follow_form").html("<%= escape_javascript(render('users/unfollow')) %>")
$("#followers").html('<%= @user.followers.count %>')
  1. #follow_form 还存在吗?
  2. 您可以调用users/unfollow吗?
  3. #followers 存在吗?

我认为这将是您的 create.js.erb 中的问题。您可以通过单击右键单击 -> 检查元素 -> 网络 -> 您刚刚发送的请求来检查这一点> -- 如果有错误,它将是红色的

关于javascript - Rails 应用程序中的 Ajax 按钮不再更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21105022/

相关文章:

ruby-on-rails - RSPEC 获取用于绑定(bind) ivars 的 ExampleGroup

JavaScript:解析来自 GitHub API 的 JSONP 回调响应

javascript - 如何在仪表事件路径上放置文本

javascript - 添加和检索到 mysql

jquery - 是否可以将鼠标光标放在元素后面或鼠标光标是否具有 z-index?

ruby-on-rails - rails : how to check CSS or JS code code from a string?

javascript - 在 Chrome 中激活窗口选项卡

jquery - Command + V 不适用于 jQuery 中的 keyup 事件

javascript - 如何使用 overflow-x :scroll? 隐藏滚动条

ruby-on-rails - 如何避免在 factory_girl 中循环创建关联模型?