我试图实现reddit风格的投票按钮,虽然不太优雅,但我认为这是最直接的方式。我有没有使用AJAX就能运行的代码,但我希望用户能够点击投票按钮并相应地更改它们,而不重新加载页面(因此需要使用AJAX)。
当我尝试删除所点击的投票按钮并替换为相应的“突出显示”的投票按钮时,问题就出现了。我之所以要替换投票按钮是因为我需要将其更改为一个可以取消投票的按钮。
(我已经简化了此过程,只处理了上投票,因为下投票具有相同的机制)。这是我的视图:
投票过该帖子的用户可以使用voted_as_when_voted_for方法,如果他们已经点赞,则返回true。 下面是点赞和已点赞的表单:
我也尝试了以下类似的操作,基于下面链接中的方法:
当我使用那段代码时,成功删除了点赞,但是点赞表单没有添加上。因此似乎我需要使用实例变量,但仍然有些问题。
我错过了什么吗?
这个人似乎有类似的问题:Rails Ajax Render Partial。
当我尝试删除所点击的投票按钮并替换为相应的“突出显示”的投票按钮时,问题就出现了。我之所以要替换投票按钮是因为我需要将其更改为一个可以取消投票的按钮。
(我已经简化了此过程,只处理了上投票,因为下投票具有相同的机制)。这是我的视图:
<% @posts.each do |post| %>
<%= post.content %>
<% if current_user.voted_as_when_voted_for post %>
<%= render 'upvoted', post: post %>
<% else %>
<%= render 'upvote', post: post %>
<% end %>
<% end %>
投票过该帖子的用户可以使用voted_as_when_voted_for方法,如果他们已经点赞,则返回true。 下面是点赞和已点赞的表单:
<%= link_to image_tag('upvoted.png', size: '18'), remove_like_post_path(post), method: :put, remote: true, id: "upvoted#{post.id}" %>
<%= link_to image_tag('upvote.png', size: '18'), like_post_path(post), method: :put, remote: true, id: "upvote#{post.id}" %>
这是我的控制器:
def upvote
@post = Post.find(params[:id])
@post.liked_by current_user
respond_to do |format|
format.html { redirect_to @post.parent }
format.js {}
end
end
def remove_upvote
@post = Post.find(params[:id])
@post.unliked_by current_user
respond_to do |format|
format.html { redirect_to @post.parent }
format.js {}
end
end
upvote.js.erb: and upvoted.js.erb:
$('#upvote<%= @post.id %>').remove().append('<%= j render("upvoted") %>');
$('#upvoted<%= @post.id %>').remove().append('<%= j render("upvote") %>');
使用这些文件,我得到了以下控制台错误:
PUT http://localhost:3000/posts/96/like 500 (Internal Server Error)
NameError in Posts#upvote
undefined local variable or method `post' for #<#<Class:0x007fde1836cbf0>:0x007fde18c00af0>
_upvote.html.erb and _upvoted.html.erb
<%= link_to image_tag('upvote.png', size: '18'), like_post_path(post), method: :put, remote: true, id: "upvote#{post.id}" %>
<%= link_to image_tag('upvoted.png', size: '18'), like_post_path(post), method: :put, remote: true, id: "upvoted#{post.id}" %>
我也尝试了以下类似的操作,基于下面链接中的方法:
$('#upvote<%= @post.id %>').remove().after('<%= j render "upvoted", post: @post %>');
当我使用那段代码时,成功删除了点赞,但是点赞表单没有添加上。因此似乎我需要使用实例变量,但仍然有些问题。
我错过了什么吗?
这个人似乎有类似的问题:Rails Ajax Render Partial。
.remove()
。然后试图将其附加到一个不再存在的元素上。 - veritas1