Rails / JS-2018年使用AJAX的Like按钮

时间:2018-11-22 21:26:42

标签: javascript ruby-on-rails ajax

我有以下项目:(除了我在这里找到的所有其他线程之外,不使用acts_as_votable gem!)

有一个Beat模型has_many:likes和belongs_to:user,一个beat has_many:likes和belongs_to:beat。在我的LikesController中,我有一个create和destroy动作来创建一个新的like like Beat的东西。 喜欢的功能工作得很好,但是,每个喜欢/不喜欢的页面都会重新加载。我想使用AJAX显示当前的赞状态(实心=喜欢),而不必重新加载页面或将redirect_to到某个地方。

controllers / likes_controller.rb:

class LikesController < ApplicationController

  def create
    @beat = Beat.find(params[:beat_id])

    if already_liked?
      flash[:notice] = "You can't like more than once!"
    else
      @beat.likes.create(user_id: current_user.id)
    end
  end

  def destroy
    @beat = Beat.find(params[:beat_id])
    @like = @beat.likes.find(params[:id])
    if !already_liked?
      flash[:notice] = "Can't unlike!"
    else
      @like.destroy
    end
  end

  private
    def already_liked?
      Like.where(user_id: current_user.id, beat_id: params[:beat_id]).exists?
    end
end

views / beats / show.html.haml

= @beat.likes.count
= (@beat.likes.count) == 1 ? 'Like' : 'Likes'

- previous_like = @beat.likes.find { |like| like.user_id == current_user.id}
- if previous_like
  = button_to 'Unlike', beat_like_path(@beat, previous_like), method: :delete, remote: true 
- else
  = button_to 'Like', beat_likes_path(@beat), method: :post, remote: true 

= link_to 'Back', :beats

通过使用remote: true,我可以向控制器发送AJAX请求,但是首先如何在控制器中处理此请求?如何发送回类似JSON / XML ajax的响应,最后:如何使用JS处理来自控制器的响应以显示在show.html.haml中?

1 个答案:

答案 0 :(得分:0)

  

controllers / likes_controller.rb

  def create
    @beat = Beat.find(params[:beat_id])

    if already_liked?
      flash.now[:notice] = "You can't like more than once!"
    else
      @beat.likes.create(user_id: current_user.id)
    end
  end
  

views / beats / show.html.erb

<p id="likes-count"><%= pluralize(@beat.likes.count, 'Like') %></p>
<div id="like-button"><%= like_button_tag @beat, previous_like %></div>
  

helpers / beats_helper.rb

module ApplicationHelper
  def like_button_tag beat, previous_like
    return button_to 'Unlike', beat_like_path(beat, previous_like), method: :delete, remote: true if previous_like
    button_to 'Like', beat_likes_path(beat), method: :post, remote: true
  end
end
  

views / beats / create.js.erb

$('#likes-count').html('<%= pluralize(@beat.likes.count, 'Like') %>');
$('#like-button').html('<%= like_button_tag @beat, previous_like %>');

您也可以使用haml代替erb