繁体   English   中英

像/不像使用acts_as_votable gem和ajax在Rails上嵌套资源

[英]Like/Unlike using acts_as_votable gem and ajax for nested resources on Rails

我意识到有几个类似的问题,但是似乎没有一个问题是使用嵌套资源来解决的。 我对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(“<%= 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文件(尝试了几次但都失败了:()

我该如何工作呢? (当前之类的东西什么也没做……而且心脏也没有显示出来。)

提前致谢。

您的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”中,但我不确定,但是如果您使用命令“ railsroutes”更新您的路线信息,您将得到回应

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

这可能会有所帮助:

div的Onclick / Javascript; Rails迭代器

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM