Rails 7中重构Hotwire/Turbo实现推文点赞功能的问题
解决方案
以下是无需改动点赞模型的前提下,修复点赞计数注册与显示问题的关键修改步骤:
1. 补全控制器中Tweet实例的获取逻辑
原likes_controller.rb的create方法未定义tweet变量,导致@tweet未赋值,Turbo Stream视图无法定位到要替换的DOM元素。修改控制器代码:
def create @tweet = Tweet.find(params[:tweet_id]) # 补充获取目标推文 @like = current_user.likes.create(tweet: @tweet) respond_to do |format| format.turbo_stream format.html { redirect_to tweets_path } # 增加HTML格式降级,避免请求报错 end end
2. 强制点赞请求以Turbo Stream格式发送
Rails 7中Turbo可能默认优先使用HTML格式处理请求,需在点赞链接中明确指定格式,同时修复原视图中未闭合的span标签:
<div> <%= link_to tweet_likes_path(tweet_presenter.tweet, format: :turbo_stream), data: { "turbo-method": "post" }, class: "text-decoration-none text-black likes" do %> <%= image_tag "heart.png", size: "20x20", class: "me-1" %> <span><%= tweet_presenter.likes.size %></span> <!-- 修复未闭合的span标签 --> <% end %> </div>
3. 优化关联数据加载(可选)
为避免N+1查询并确保点赞计数实时更新,可在控制器获取推文时预加载likes关联:
@tweet = Tweet.find(params[:tweet_id]).includes(:likes)
也可以在TweetPresenter中新增计数方法优化可读性:
class TweetPresenter # ... 原有代码 ... def likes_count tweet.likes.size end end
之后在视图中替换为<%= tweet_presenter.likes_count %>即可。
额外排查点
- 检查浏览器控制台是否有Turbo相关报错(如DOM元素未找到、请求状态码异常)
- 确认项目已正确引入Turbo(
application.js中存在import "@hotwired/turbo-rails") - 验证路由配置正确性,确保是嵌套路由:
resources :tweets do resources :likes end
内容的提问来源于stack exchange,提问作者German
相关产品推荐
相关产品推荐

