1

我意识到有几个类似的问题,但似乎都没有解决嵌套资源的问题。我对 ROR 很陌生,我正在尝试使用带有acts_as_votable gem的ajax 来实现一个喜欢/不喜欢的东西。我有点了解 ajax 在 Rails 中的工作原理,但我似乎在自己实现它时遇到了问题。

结构

我的应用程序有一个 Q 列表,每个 Q 都有一个 As 列表。用户可以“收藏/取消收藏”一个问题或“喜欢/不喜欢”一个答案。不允许像在 stackoverflow 中那样“否决”答案 - 用户只能“撤消”他们的投票。

目前的尝试

这与我的 show.html.erb 的Question片段类似。它不是一个单独的部分文件。它在显示视图中。:

<% @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 %> 

我的路线:

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

我的答案控制器有这两种方法:

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

这是我在这个博客的巨大帮助下制作的 js ,我不知道该放在哪里:

$(“#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(“&lt;%= j (render partial: ‘answers/likes’, locals: {answer: @answer} ) %>”);

=> 但我认为一切都应该是@question.answer.id,因为答案嵌套在问题中 -> 我对此完全感到困惑。但是如果我使用@question.answer.id,{answer: @answer} 这部分应该是什么样子?

部分是(_likes.html.erb)

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

所以我对一些事情感到困惑:

  1. _likes.html.erb 和 like.js.erb 在我的项目目录中的位置(在答案中?在问题中?)
  2. 嵌套答案时如何编写我的 like.js.erb 文件(尝试了几次但都失败了:()

我怎样才能让它工作?(目前 like 什么都不做......而且心脏也没有显示出来。)

提前致谢。

4

2 回答 2

0

你的 js 应该在一个像 html.erb 但 js.erb 这样的模板中。所以这个js

$("#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} ) %>");

应该在“views/answers/upvote.js.erb”中,但我不确定,但如果您使用命令“rails routes”更新您的帖子,您将收到回复

于 2017-07-20T10:02:03.870 回答
0

我相信您在迭代时没有得到正确的 id,而是始终在 javascript 文件上使用 @answer.id。

这可能会有所帮助:

用于 div 的 Onclick/Javascript;Rails 迭代器

于 2018-03-20T19:44:21.513 回答