作为可投票的Ajax失败

Ser*_*ncu 6 ajax ruby-on-rails

我是ruby的新手,我只是玩了一个演示应用程序.我已经包含了gem的act_as_votable,它的效果非常好,除了一个事实,我把它丢失了...... ajax.一直刷新页面有点乏味,所以我"试着"实现ajax,但没有运气:(.经过两个小时的资源后我觉得我什么也做不了.我需要帮助实现ajax on向下和向上投票.非常感谢.

这是我的代码:

entries_controller.rb

  def upvote
    @entry = Entry.find(params[:id])
    unless current_user.voted_for? @entry
      @entry.vote_total = @entry.vote_total + 1
      @entry.save
      @entry.upvote_by current_user
    else
      flash[:danger] = 'Sorry!! You had allready voted this entry!'
    end
    redirect_to :back
  end

  def downvote
    @entry = Entry.find(params[:id])
    unless current_user.voted_for? @entry
      @entry.vote_total = @entry.vote_total + 1
      @entry.save
      @entry.downvote_by current_user
    else
      flash[:danger] = 'Sorry!! You had allready voted this entry!'
    end
    redirect_to :back
  end
Run Code Online (Sandbox Code Playgroud)

_entry.html.erb(在条目文件夹中)

<aside class="vote-count bind-<%= entry.id %>">
  <%= link_to like_entry_path(entry), :remote => true, method: :put, class: 'vpos' do %>
  <i class="fa fa-thumbs-up"></i>
    <%= entry.get_upvotes.size %>
  <% end %>
  <%= link_to dislike_entry_path(entry), :remote => true, method: :put, class: 'npos' do %>
    <i class="fa fa-thumbs-down"></i>
  <%= entry.get_downvotes.size %>
  <% end %>
</aside>
Run Code Online (Sandbox Code Playgroud)

upvote.js.erb(在条目文件夹中)

$(".bind-<%=entry.id%>").html('<%=escape_javascript entry.get_upvotes.size %>');
Run Code Online (Sandbox Code Playgroud)

的routes.rb

resources :entries,  only: [:index, :show, :new, :create, :destroy] do
  member do
    put 'like', to: 'entries#upvote'
    put 'dislike', to: 'entries#downvote'
  end
end
Run Code Online (Sandbox Code Playgroud)

我对rails有点新,所以无论如何都有帮助.非常感谢!! 谢谢

Ser*_*ncu 6

Finnaly我已经设法让它工作(充当可投票的宝石,投票现在是ajax).我要分享它,因为有人和我有同样的问题.

routes.rb:

put 'like', to: 'entries#upvote'
put 'dislike', to: 'entries#downvote'
Run Code Online (Sandbox Code Playgroud)

entries_controller.rb(在我的例子中):

def upvote
  @entry = Entry.find(params[:id])
  respond_to do |format|
  unless current_user.voted_for? @entry
    format.html { redirect_to :back }
    format.json { head :no_content }
    format.js { render :layout => false }
    @entry.vote_total = @entry.vote_total + 1
    @entry.save
    @entry.upvote_by current_user
  else
    flash[:danger] = 'You allready voted this entry'
    format.html { redirect_to :back }
    format.json { head :no_content }
    format.js
  end
 end
end

def downvote
  @entry = Entry.find(params[:id])
  respond_to do |format|
  unless current_user.voted_for? @entry
    format.html { redirect_to :back }
    format.json { head :no_content }
    format.js { render :layout => false }
    @entry.vote_total = @entry.vote_total + 1
    @entry.save
    @entry.downvote_by current_user
  else
    flash[:danger] = 'You allready voted this entry'
    format.html { redirect_to :back }
    format.json { head :no_content }
    format.js
  end
 end
end
Run Code Online (Sandbox Code Playgroud)

_entry.html.erb(部分):

<aside class="vote-count bind-<%= entry.id %>">
 <%= link_to like_entry_path(entry), :remote => true, method: :put, class: 'vpos' do %>
  <i class="fa fa-thumbs-up"></i>
  <span class="vcount-<%= entry.id %>"><%= entry.get_upvotes.size %></span>
 <% end %>
 <%= link_to dislike_entry_path(entry), :remote => true, method: :put, class: 'npos' do %>
  <i class="fa fa-thumbs-down"></i>
  <span class="ncount-<%= entry.id %>"><%= entry.get_downvotes.size %></span>
 <% end %>
</aside>
Run Code Online (Sandbox Code Playgroud)

upvote.js.erb:

$('.vpos').bind('ajax:success', function() {
 $('.vcount-<%= @entry.id %>').html('<%=escape_javascript @entry.get_upvotes.size.to_s %>');
});
Run Code Online (Sandbox Code Playgroud)

downvote.js.erb:

$('.npos').bind('ajax:success', function() {
 $('.ncount-<%= @entry.id %>').html('<%=escape_javascript @entry.get_downvotes.size.to_s %>');
});
Run Code Online (Sandbox Code Playgroud)

就这样.希望我可以帮助那些需要帮助的人.干杯.