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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 03:05:18