【问题标题】:AJAX button processes, doesn't changeAJAX 按钮处理,不会改变
【发布时间】:2017-10-29 03:32:14
【问题描述】:

我发现很多人都有同样的问题,但没有一个解决方案适用于我的情况。我关注Michael Hartl's tutorial here。我按照第 14 章设置了一个跟随系统(我使用的是本书的最新版本,因为我使用的是 Rails 5.1)。数据库中的关注/取消关注按钮处理,但我必须手动刷新页面才能看到按钮和关注计数变化。

我在浏览器控制台日志中得到了这个:

POST  500 (Internal Server Error)
    jquery.self-bd7ddd393353a8d2480a622e80342adf488fb6006d667e8b42e4c0073393abee.js:10255 
    send @ jquery.self-bd7ddd393353a8d2480a622e80342adf488fb6006d667e8b42e4c0073393abee.js:10255
    ajax @ jquery.self-bd7ddd393353a8d2480a622e80342adf488fb6006d667e8b42e4c0073393abee.js:9739
    ajax @ jquery_ujs.self-784a997f6726036b1993eb2217c9cb558e1cbb801c6da88105588c56f13b466a.js:94
    handleRemote @ jquery_ujs.self-784a997f6726036b1993eb2217c9cb558e1cbb801c6da88105588c56f13b466a.js:179
    (anonymous) @ jquery_ujs.self-784a997f6726036b1993eb2217c9cb558e1cbb801c6da88105588c56f13b466a.js:512
    dispatch @ jquery.self-bd7ddd393353a8d2480a622e80342adf488fb6006d667e8b42e4c0073393abee.js:5227
    elemData.handle @ jquery.self-bd7ddd393353a8d2480a622e80342adf488fb6006d667e8b42e4c0073393abee.js:4879

relationships_controller.rb:

class RelationshipsController < ApplicationController
  before_action :authenticate_user!

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

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

视图/用户/_follow.html.erb:

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

views/users/_unfollow.html.erb

<%= form_for(current_user.active_relationships.find_by(followed_id: @user.id),
                   html: { method: :delete }, remote: true) do |f| %>
  <%= f.submit "Unfollow", class: "btn" %>
<% end %>

视图/用户/_follow_form.html.erb

<% if current_user != @user %>
  <div id="follow_form">
    <% if current_user.following?(@user) %>
      <%= render 'unfollow' %>
    <% else %>
      <%= render 'follow' %>
    <% end %>
  </div>
<% end %>

relationships/create.js.erb

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

relationships/destroy.js.erb

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

users_controller.rb

class UsersController < ApplicationController
  before_action :authenticate_user!, only: [:index, :edit, :update, :destroy,
                                        :following, :followers]

  def index
    @page_title = "Forge Users"
    @users = User.all
  end

  def show
    @user = User.find(params[:id])
    @posts = Post.all
  end

  def following
    @title = "Following"
    @user  = User.find(params[:id])
    @users = @user.following
    render 'show_follow'
  end

  def followers
    @title = "Followers"
    @user  = User.find(params[:id])
    @users = @user.followers
    render 'show_follow'
  end

end

我做错了什么?

【问题讨论】:

  • 为什么你认为它应该改变按钮? onclick() Javascript 事件在哪里? :back在这里面去什么? redirect_to(:back) 尝试redirect_to user_path(@user) 或您正在查看的任何页面,然后它将重新加载该页面。为什么您的标题中说 AJAX,但您的问题中没有 AJAX 调用 ($.post())?为此显示 JS。
  • 你包含 jquery_ujs 了吗?
  • 我的 application.js 文件中需要 jquery_ujs。
  • Chloe,当表单被处理时,关系控制器应该做所有的 js 工作(调用 create.js 和 destroy.js)。我错了吗?
  • 浏览器调试控制台的“网络”选项卡中是否出现任何服务器错误?控制台选项卡中的任何错误怎么办?您不需要format.js 中的render 吗?

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


【解决方案1】:

您需要将 Javascript 文件重命名为以 .erb 结尾。

relationships/create.js.erbrelationships/destroy.js.erb。这是因为文件中有 Ruby,所以它必须在 Ruby 被解释为 Javascript 并返回之前对其进行处理。

http://guides.rubyonrails.org/working_with_javascript_in_rails.html#a-simple-example

【讨论】:

  • 我的错误,他们在我的应用程序中有 .js.erb 扩展名,我在这里搞砸了。
  • 你能把console.log("&lt;%= escape_javascript(render('users/unfollow')) %&gt;");加到他们身上,看看它是否在浏览器控制台中呈现正确的文本吗?
  • 我在我的问题中添加了控制台内容。
【解决方案2】:

你设置了局部变量user

def create
  user = User.find(params[:followed_id])

但在 .js.erb 模板中引用类实例变量 @user

$("#followers").html('<%= @user.followers.count %>');

改为设置@user = User.find(params[:followed_id]),使其可用于视图。实际上,我认为您正在尝试设置@user = current_user。这可能更有意义。

【讨论】:

  • 将其更改为 @user = ... 实际上破坏了整个功能,因此 db 部分甚至无法工作。
  • 问题是方法中的所有变量都需要是实例变量。
猜你喜欢
  • 2013-03-05
  • 2020-03-01
  • 2020-06-06
  • 2018-07-17
  • 1970-01-01
  • 1970-01-01
  • 2015-12-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多