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有点新,所以无论如何都有帮助.非常感谢!! 谢谢
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)
就这样.希望我可以帮助那些需要帮助的人.干杯.
| 归档时间: |
|
| 查看次数: |
1512 次 |
| 最近记录: |