2017-07-20 1 views
0

Ich weiß, dass es mehrere ähnliche Fragen gibt, aber keine von ihnen scheint das Problem mit verschachtelten Ressourcen zu adressieren. Ich bin ziemlich neu in ROR und ich versuche, ein ähnliches/unähnliches Ajax mit der acts_as_votable gem zu implementieren. Ich verstehe, wie Ajax in Rails funktioniert, aber ich habe Probleme, es selbst zu implementieren.Like/Im Gegensatz zu Acts_as_votable Gem und Ajax für verschachtelte Ressourcen auf Rails

Die Struktur

hat Mein App eine Liste von Qs, die jeweils eine Liste von As haben. Benutzer können eine Frage mit einem Lesezeichen oder einem Lesezeichen versehen oder eine Antwort ähnlich/ungleich. Das "Downvoting" einer Antwort wie in stackoverflow ist nicht erlaubt - Benutzer können ihre abgegebenen Stimmen nur "rückgängig machen".

Aktuelle Versuche

Dies ist wie Schnipsel meines show.html.erb für eine Frage. Es ist keine separate Teildatei. Es ist in der Show Ansicht .:

<% @question.answers.each do |answer| %> 
*omit* 
<% if current_user.id!=answer.user_id %> 
    <div class="heart-like"> 
    <br> 
    <!-- Like Button --> 

    <% if current_user.liked? answer %> 
     <%= link_to unvote_question_answer_path(@question, answer), id: “like_#{answer.id}”, remote: :true do %> 
     <span class="fa fa-heart fa-2x"></span> 
     <% end %> 
    <% else %> 
     <%= link_to like_question_answer_path(@question, answer), id: “like_#{answer.id}”, remote: :true do %> 
     <span class="fa fa-heart-o fa-2x"></span> 
     <% end %> 
    <% end %> 
    <br> 
    </div> 
<% end %> 

Meine Routen:

resources :questions do 
    member do 
    get "bookmark" 
    end 
    resources :answers do 
    member do 
     put "like", to: "answers#upvote" 
     put "unvote", to: "answers#unvote" 
    end 
    resources :comments, only: [:index, :new, :create, :destroy] 
    end 
end 

Meine Antworten Controller hat diese beiden Methoden:

def upvote 
    begin 
    @question = Question.find(params[:question_id]) 
    @answer = Answer.find(params[:id]) 
    @answer.liked_by current_user 
    respond_to do |format| 
     format.html { redirect_to :back } 
     format.js 
    end 
    rescue ActiveRecord::RecordInvalid 
    render :nothing => true, :status => 404 
    end 
end 

# undo prev vote 
def unvote 
    begin 
    @question = Question.find(params[:question_id]) 
    @answer = Answer.find(params[:id]) 
    @answer.unliked_by current_user 
    respond_to do |format| 
     format.html { redirect_to :back } 
     format.js 
    end 
    end 
end 

Und das ist die js ich enorme Hilfe aus this blog, die ich nicht weiß wo zu setzen:

$(“#like_<%= @answer.id %>”).removeClass(‘fa fa-heart-o’).addClass(‘fa fa-heart’); 
$(“#like_<%= @answer.id %>”).attr(“href”, ‘/answers/<%= @answer.id %>/unlike’); 
$(“#likes_<%= @answer.id %>”).html(“<%= j (render partial: ‘answers/likes’, locals: {answer: @answer}) %>”); 

=> ABER ich denke, dass alles @frage.answer.id sein sollte, weil die Antworten in den Fragen verschachtelt sind -> die ich völlig verwirrt bin. Aber wenn ich @ question.answer.id verwende, wie soll dieser Teil aussehen?

Und der Teil ist (_likes.html.erb)

<div class="num-votes"> 
    <%= answer.votes_for.size %> Likes 
</div> 

Also ich bin verwirrt über ein paar Dinge:

  1. Wo kommt _likes.html.erb und like.js. gehen erb in meinem Projekt dir (in Antworten? in Fragen?)
  2. Wie kann ich meine like.js.erb Datei zu schreiben, wenn die Antworten geschachtelt sind (ein paar Versuche gemacht, aber alle gescheitert :()

Und wie kann ich das zur Arbeit bringen? (zur Zeit tut das Gleiche nichts ... und das Herz wird auch nicht angezeigt.)

Vielen Dank im Voraus.

Antwort

0

Ihre js sollte in einer Vorlage wie eine html.erb aber js.erb sein. So js diese

$(“#like_<%= @answer.id %>”).removeClass(‘fa fa-heart-o’).addClass(‘fa fa-heart’); 
$(“#like_<%= @answer.id %>”).attr(“href”, ‘/answers/<%= @answer.id %>/unlike’); 
$(“#likes_<%= @answer.id %>”).html(“<%= j (render partial: ‘answers/likes’, locals: {answer: @answer}) %>”); 

in sein sollte „Ansichten/Antworten/upvote.js.erb“ aber ich bin sicher nicht, aber wenn Sie Ihren Beitrag mit Ihren Routen mit dem Befehl aktualisieren ‚Schienen Routen‘ , werden Sie habe eine Antwort

Verwandte Themen