喜欢/不同于在Rails上使用acts_as_votable gem和ajax来嵌套资源

时间:2017-07-20 07:46:27

标签: ruby-on-rails ruby ajax acts-as-votable

我意识到有几个类似的问题,但它们似乎都没有解决嵌套资源的问题。我对ROR很陌生,我正在尝试实现类似/不同于使用acts_as_votable gem的ajax。我有点理解ajax在Rails中是如何工作的,但我似乎在自己实现它时遇到了问题。

结构

我的应用程序有一个Q列表,每个都有一个As列表。用户可以将书签/取消签名'一个问题或者'喜欢/不喜欢'一个答案。 ' Downvoting'不允许像stackoverflow中的答案 - 用户只能撤消'他们的投票。

当前尝试

对于问题,这就是我的show.html.erb的摘录。它不是一个单独的部分文件。它在节目视图中。:

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

这是我在this blog的大力帮助下制作的,我不知道该放在哪里:

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

=&GT;但我认为一切都应该是@ question.answer.id,因为答案嵌套在问题中 - &gt;我完全糊涂了。但如果我使用@ 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. 如果嵌套答案(尝试几次但都失败了:()
  3. ,我如何编写我的like.js.erb文件

    我怎样才能让它发挥作用? (目前似乎并没有做任何事......而且心脏也没有显示出来。)

    提前致谢。

2 个答案:

答案 0 :(得分:0)

你的js应该在html.erb之类的模板中,但是js.erb。所以这是js

auto ptr_ = ptr.operator->();
auto func_ = &decltype(ptr)::element_type::func;
ptr_->*func_(std::move(ptr));

应该在&#34; views / answers / upvote.js.erb&#34;但是我不确定,但是如果你使用命令&#39; rails routes&#39;更新你的帖子,你就会有回复

答案 1 :(得分:0)

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

这可能会有所帮助:

Onclick/Javascript for div; Rails iterator