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:
- Wo kommt _likes.html.erb und like.js. gehen erb in meinem Projekt dir (in Antworten? in Fragen?)
- 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.