【发布时间】:2014-06-14 06:00:29
【问题描述】:
我正在尝试完成我认为最直接但肯定不是最优雅的 reddit 风格投票按钮的复制。我的代码可以在没有 AJAX 的情况下工作,但我希望用户能够单击投票按钮,并且他们可以在不重新加载页面的情况下进行适当的更改(因此是 AJAX)。
当我尝试删除单击的投票按钮并替换为适当的“突出显示”投票按钮时,会出现问题。我替换投票按钮的原因是因为我需要将其更改为单击后将取消投票的按钮。
(我已将其简化为仅处理 upvoting,因为 downvoting 是相同的 mechhanic)。这是我的观点:
<% @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: 和 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 和 _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 %>');
当我使用该代码时,upvote 已成功删除,但未添加 upvote 表单。所以看来我需要使用实例变量,但有些东西仍然不太有效。
我错过了什么??
这个人好像也有类似的问题:Rails Ajax Render Partial
【问题讨论】:
-
开发者控制台有错误吗?您可以在 js.erb 文件中发出警报吗?
-
我在控制台日志中添加了生成错误的代码。我是 Rails 新手,对这些日志不是很有经验,所以如果您想从它们那里看到更多内容,请告诉我。
-
尝试 $('#upvote').remove().after('');
-
这里可能还有其他问题,但对于 javascript,您在匹配的元素上调用
.remove()。然后尝试append到一个不再存在的元素。 -
@veritas1,没错,而是我先附加,然后删除链接。
标签: ruby-on-rails ajax ruby-on-rails-4