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
相关产品推荐
相关产品推荐

