Rails和ajax:act_as_votable行为

时间:2016-12-05 20:10:18

标签: jquery ruby-on-rails ajax

我已经在我的应用程序中创建了一个喜欢帖子的喜欢按钮,但是我希望在没有刷新页面的情况下追加,看看计数上的de +1和" hearth"按钮是否填充。我尝试了以下代码,但是我有这个错误:

jquery.self-bd7ddd3….js?body=1:10255 PUT http://localhost:3000/posts/12/like 500 (Internal Server Error)

这是我的_posts.html.erb文件:

<div class="vote-rv">
          <% if current_user.liked? post %>
            <%= link_to "", dislike_post_path(post), class: "dislike fa fa-heart", method: :put, remote: true %>
          <% else %>
            <%= link_to "", like_post_path(post), class: "like fa fa-heart-o", method: :put, remote: true %>
          <% end %>
          <span class="badge" data-id="<%= post.id %>"><%= post.get_likes.size %></span>
          </div>

这是我的routes.rb

resources :travels, :shallow => true do
        # Posts
        resources :posts do
            member do
                put "like" => "posts#like"
                put "dislike" => "posts#dislike"
            end
        end
    end

这是我的posts_controller.rb(喜欢和不喜欢的方法)

def like
        @post.like_from current_user
        respond_to do |format|
            format.html { redirect_to :back }
            format.json { head :no_content }
            format.js { render :layout => false }
        end
    end

    def dislike
        @post.dislike_by current_user
        respond_to do |format|
            format.html { redirect_to :back }
            format.json { head :no_content }
            format.js { render :layout => false }
        end
    end

知道问题是什么?

谢谢!

1 个答案:

答案 0 :(得分:0)

您需要包含两个js.erb个文件,一个名为like.js.erb,另一个名为dislike.js.erb,这些文件会响应控制器中的喜欢和不喜欢的方法。

以下是like.js.erb ajax文件的示例。这位于与_posts.html.erb文件相同的文件夹中的观看次数/帖子下:

$('.like').bind('ajax:success', function() {
    $('<%= post.id %>').html('<%= escape_javascript post.get_likes.size %>');
    $('#like_<%= post.id %>').removeClass('fa-heart-o').addClass('fa-heart');
});

对于dislike.js.erb文件,您需要执行类似的操作,但需要切换类名,并将post.get_likes.size更改为post.get_dislikes.size并在视图中添加该行想要看到不喜欢的计数

您还需要在同一视图中添加ID,以便心脏的ajax更改正常工作:

<%= link_to "", like_post_path(post), id: "like_<%= post.id %>", class: "like fa fa-heart-o", method: :put, remote: true %>

将喜欢和不喜欢的方法更改为:

@post.liked_by current_user
respond_to do |format|
    format.html { redirect_to :back }
    format.js
end

@post.disliked_by current_user
respond_to do |format|
    format.html { redirect_to :back }
    format.js
end