2014-12-04 5 views
6

Я новичок в рубине, и я просто играл с демо-приложением. Я включил жемчужину act_as_votable, и он отлично работает, за исключением одного факта, что я теряю его ... ajax. Обновляя все время страницы, это немного утомительно, поэтому я «попытался» реализовать ajax, но не повезло :(После двухчасового ресурса я думаю, что больше ничего не могу. Мне нужна помощь по внедрению ajax .. вниз и вверх голосов большое спасибоAct As Votable Ajax Fail

Вот мой код:

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 

_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> 

upvote.js.erb (в папке записей)

$(".bind-<%=entry.id%>").html('<%=escape_javascript entry.get_upvotes.size %>'); 

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 

Я немного новые рельсы так anykind помощи. был бы очень признателен !! Спасибо

ответ

6

Finnaly Мне удалось заставить его работать (выступает в качестве мотируемого голоса, теперь голоса являются ajax). Я собираюсь поделиться им с тем, что у кого-то есть такая же проблема, как и я.

routes.rb:

put 'like', to: 'entries#upvote' 
put 'dislike', to: 'entries#downvote' 

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 

_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> 

upvote.js .erb:

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

downvote.js.erb:

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

Это все. Надеюсь, что я могу помочь кому-то, кому нужна рука. Cheers.

+0

Спасибо за это! Супер-полезный. У меня есть вопрос о ваших файлах js.erb - какова их функция и где вы их ставите? Не Rails ': remote => true обрабатывает запрос AJAX? –

1

Это мое решение. Проект: Пользователь может создать сообщение (debat), а другие пользователи могут выдвигать и понижать с помощью кнопок.

Чем отличается:

Аякса обновить отсчитывать downvoteS и отсчитывать upvotes в то же самое время, когда пользователь нажимает. Я использовал .text вместо .html в своих файлах javascript. Я не использовал частичный, я поместил весь свой код в debat.html.erb. я создал специальный класс для каждой кнопки с пролетом и идентификатором переменным, так как все кнопки изменились в то же время

Моего routes.rb тот же:

resources :debats do 
member do 
    put "like", to: "debats#upvote" 
    put "dislike", to: "debats#downvote" 
end 
end 

dabats_controller.RB:

def upvote 
    @debat = Debat.find(params[:id]) 
    @debat.upvote_by current_user 
    respond_to do |format| 
     format.html {redirect_to :back } 
     format.json { render json: { count: @debat.liked_count } } 
     format.js { render :layout => false } 
    end 
end 

def downvote 
    @debat = Debat.find(params[:id]) 
    @debat.downvote_by current_user 
    respond_to do |format| 
    format.html {redirect_to :back } 
    format.json { render json: { count: @debat.disliked_count } } 
    format.js { render :layout => false } 
end 
end 

debat.html.erb (только часть с 2 кнопками)

<div class="large-1 columns count"> 
    <span class= "like-<%= debat.id %>"> 
     <%= link_to like_debat_path(debat), method: :put, remote: true, class: 'like' do %> 
     <div class="upcount"><i class="fa fa-angle-up"></i></div> 
     <div class="ouicount up-<%= debat.id %>"><%= debat.get_upvotes.size %></div> 
     <div class="oui">Oui</div> 
     <%end%> 
    </span> 

    <span class= "dislike-<%= debat.id %>"> 
     <%= link_to dislike_debat_path(debat), method: :put, remote: true, class: 'dislike' do %> 
     <div class="non">Non</div> 
     <div class="noncount down-<%= debat.id%>"> <%= debat.get_downvotes.size %></div> 
     <div class="downcount"><i class="fa fa-angle-down"></i></div> 
     <% end %> 
    </span> 
    </div> 

upvote.js.erb

$('.like').bind('ajax:success', function() { 

    $('.up-<%= @debat.id %>').text(<%= @debat.get_upvotes.size%>); 
    $('.down-<%= @debat.id %>').text(<%= @debat.get_downvotes.size%>); 

}); 

downvote.js.erb

$('.dislike').bind('ajax:success', function() { 

$('.up-<%= @debat.id %>').text(<%= @debat.get_upvotes.size%>); 
$('.down-<%= @debat.id %>').text(<%= @debat.get_downvotes.size%>); 

}); 

Надеюсь, это поможет!

Смежные вопросы