Acts_As_Votable Ajax请求

时间:2015-12-01 01:50:35

标签: javascript jquery ruby-on-rails ajax

试图弄清楚如何让ajax使用我的Acts_As_Votable按钮。

这就是我现在所拥有的。

post_controller.rb

def favorite
  @post = Post.find(params[:id])
  @post.upvote_from current_user
  respond_to do |format|
    format.js
  end 
end

def unfavorite 
  @post = Post.find(params[:id])
  @post.unvote_by current_user
  respond_to do |format|
   format.js
  end 
end

_post.html.erb

<% if current_user.voted_on? post  %>
  <%= link_to '<i style="color: red" class="fa fa-star"></i> Favorited'.html_safe, unfavorite_post_path(post), method: :put, remote: true, id: "unfavorite" %>
<% else %> 
  <%= link_to '<i class="fa fa-star"></i> Favorite'.html_safe, favorite_post_path(post), method: :put, remote: true, id: "favorite" %>
<% end %>

favorite.js.erb&amp; unfavorite.js.erb

$('#favorite').html("<i style='color: red' class='fa fa-star'></i> Favorited");

$('#unfavorite').html("<i class='fa fa-star'></i> Favorite");

现在我已经部分工作了。我有两个问题。

  1. 每个页面包含多个帖子。我怎么能告诉format.js.erb文件来定位那个spectific post的favoirte按钮。现在,jQuery只更改了第一个帖子按钮,无论我在哪里点击页面。我已尝试将link_to ID设置为收藏夹&lt;%= post.id%&gt;然后使用收藏夹&lt;%= post.id%&gt;在format.js文件中但是没有用。
  2. 我想更改format.js文件,将实际按钮放入div而不是仅仅更改其文本。因此,用户无需刷新页面即可切换收藏夹和不喜欢的内容。我已经尝试将link_to按钮放在.html(“”)部分内,但这不起作用。我不确定如何使用ajax提交帖子请求。
  3. 谢谢你的帮助!如果您需要更多代码或我不清楚某些事情,请告诉我。

1 个答案:

答案 0 :(得分:2)

id在一个页面中必须是唯一的。您应该可以将post.id附加到您的链接:

<强> _post.html.erb

<% if current_user.voted_on? post  %>
  <%= render 'unfavorite_link', post: post %>
<% else %> 
  <%= render 'favorite_link', post: post %>
<% end %>

<强> _favorite_link.html.erb

<%= link_to '<i class="fa fa-star"></i> Favorite'.html_safe, favorite_post_path(post), method: :put, remote: true, id: "favorite-#{post.id}" %>

<强> _unfavorite_link.html.erb

<%= link_to '<i style="color: red" class="fa fa-star"></i> Favorited'.html_safe, unfavorite_post_path(post), method: :put, remote: true, id: "unfavorite-#{post.id}" %>

除了仅使用AJAX设置html,您可以使用replaceWith替换整个链接,而不仅仅是内部HTML:

<强> favorite.js.erb

$('#favorite-<%= @post.id %>').replaceWith('<%= escape_javascript render 'unfavorite_link', post: @post %>');

<强> unfavorite.js.erb

$('#unfavorite-<%= @post.id %>').replaceWith('<%= escape_javascript render 'favorite_link', post: @post %>');