我有以下项目:(除了我在这里找到的所有其他线程之外,不使用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中?
答案 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