You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rails 7中acts_as_votable点赞功能失效问题求助

问题排查与解决方法

1. 核心问题:路由未正确配置

终端显示请求路由到PostsController#show,说明你没有在路由中注册like这个自定义动作。Rails的RESTful路由默认不包含like动作,必须手动添加:

打开config/routes.rb,修改posts资源的定义:

resources :posts do
  member do
    put :like # 匹配PUT请求到/posts/:id/like,对应PostsController#like
  end
end

添加后运行rails routes | grep like验证,应该看到类似输出:

like_post PUT    /posts/:id/like(.:format) posts#like

如果没有这条路由,说明配置错误,这是导致请求跳转到show的直接原因。

2. 修正计数方法与视图结构

计数方法错误

你当前用的post.get_likes.size可能不是acts_as_votable的正确方法。默认情况下,liked_by方法创建的是upvote,正确获取点赞数的方法是:

<%= pluralize(post.get_upvotes.size, 'Like') %>

如果确实需要用get_likes,需确认是否在模型中自定义了点赞类型,否则会返回空集合导致计数始终为0。

视图与JS选择器不匹配

你的like.js.erb中使用了#like-count和#like-link选择器,但_likes.html.erb中没有给对应的元素添加id,导致JS无法更新页面。修改局部视图:

<span id="like-count"><%= pluralize(post.get_upvotes.size, 'Like')%></span>
<div id="like-link">
  <% if current_user %>
    <% vote_text = current_user.voted_for?(post) ? "unlike" : "Like" %>
    <%= button_to vote_text, like_post_path(post), method: :put, remote: true, class:'like-post' %>
  <% else %>
    <%= button_to "Like", new_user_session_path, class:'like-post' %>
  <% end %>
</div>

3. 完善控制器响应

在PostsController#like方法末尾添加respond_to :js,明确告诉Rails只响应JS格式的请求(适配你的remote: true配置):

def like
  @post = Post.find(params[:id])
  if current_user.voted_for? @post
    @post.unliked_by current_user
  else
    @post.liked_by current_user
  end
  respond_to :js # 新增这行
end

4. 适配Rails7 Turbo

Rails7默认启用Turbo,若你的remote: true未生效,可尝试:

  • 在button_to中添加data: { turbo: false }(禁用Turbo处理该请求)
  • 确保like.js.erb文件放在app/views/posts目录下,路径正确

内容的提问来源于stack exchange,提问作者swaeetpotato

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 09:22:09