jquery - rails 上的 ruby : vote/unvote using ajax

标签 jquery ruby-on-rails ruby ajax

我在 ruby​​ 中使用acts_as_votable 作为我的投票系统。现在我可以投票/反对并更新计数器。但我想要的是投票,然后投反对票,然后再次投票,但我只能通过刷新来做到这一点。如果我投票然后投反对票,我怎样才能将投票计数器更新为“-1”?

Controller :

  def upvote
    @improvement_action.upvote_from current_user  #, :vote_scope => 'upvote'
    respond_to do |format|
    format.json { render json: { count: @improvement_action.get_upvotes.size } }
    format.html {redirect_to :back}
    end
  end

  def downvote
    @improvement_action.downvote_from current_user#, :vote_scope => 'upvote'

    respond_to do |format|
      format.json { render json: { count: @improvement_action.get_downvotes.size } }
      format.html {redirect_to :back}
    end
  end

查看:

<%= link_to like_improvement_action_path(improvement_action), class:"btn btn-default stat-item like", method: :put, remote: true, data: { type: :json } do %>
                        <span class="fa fa-thumbs-up icon" aria-hidden="true"></span>
                        <span class="like_number"> <%= improvement_action.get_upvotes.size %></span>
                    <% end %>

   <%= link_to unlike_improvement_action_path(improvement_action), class:"btn btn-default stat-item downvote", method: :put, remote: true, data: { type: :json } do %>
                        <span class="fa fa-thumbs-down icon" aria-hidden="true"></span>
                        <span class="unlike_number"> <%= improvement_action.get_downvotes.size %></span>
                    <% end %>

和application.js:

$(document).ready(function() {

$('.like')
    .on('ajax:success', function (e, data, status, xhr) {
        $('.like_number').html(data.count)

    })
    .on('ajax:send', function () {
        $(this).addClass('loading');
    })
    .on('ajax:complete', function () {
        $(this).removeClass('loading');
    })
    .on('ajax:error', function (e, xhr, status, error) {
        console.log(status);
        console.log(error);
    })

$('.downvote')
    .on('ajax:success', function (e, data, status, xhr) {

        $('.unlike_number').html(data.count);


    })
    .on('ajax:send', function () {
        $(this).addClass('loading');
    })
    .on('ajax:complete', function () {
        $(this).removeClass('loading');
    })
    .on('ajax:error', function (e, xhr, status, error) {
        console.log(status);
        console.log(error);
    })
});

最佳答案

您可以通过创建两个文件 upvote.js.erb 和 downvote.js.erb,然后添加您期望在此文件中发生的行为来完成此操作。

js代码:

$(document).ready(function() {

   $(document).on('click', '.like', function ( {
        $(this).addClass('loading');
   });

   $(document).on('click', '.downvote' ,function (){
        $(this).addClass('loading');
    });
});

upvote.js.erb:(文件名应与 Controller 中的方法相同)

$('.like').removeClass('loading');
 //updated the below lines in both upvote.js.erb and downvote.js.erb
$('.like_number').html('<%= @improvement_action.get_upvotes.size %>');
$('.unlike_number').html('<%= @improvement_action.get_downvotes.size %>');

downvote.js.erb:

$('.downvote').removeClass('loading');
$('.like_number').html('<%= @improvement_action.get_upvotes.size %>');
$('.unlike_number').html('<%= @improvement_action.get_downvotes.size %>');

关于jquery - rails 上的 ruby : vote/unvote using ajax,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36716867/

相关文章:

javascript - 如何点击div并且不触发点击 Action

ruby-on-rails - Ruby:从数组中删除第一个元素的最简单方法是什么?

java - 读取 Asta/Power 项目时出错

php - 为每个 jQuery 调用创建新类是最佳实践吗?

javascript - 从元素内部单击时从父元素中删除类

javascript - 如何在 jquery 中执行 div 禁用?

javascript - 如何强制更改事件发生在选择元素上

ruby-on-rails - 在 Rails 3.2 中实现计数时出错

ruby-on-rails - 当给定具有特殊字符的电子邮件地址时,Ruby on Rails 中的 ActionMailer 会中断

ruby - GC.start 在 Pry 中无效,但在 IRB 中有效