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

Rails Turbo Frames点击按钮后‘内容缺失’问题的极简解决咨询

解决Turbo Frame更新后显示"Content Missing"的问题

你的思路没问题,不用自定义路由也不用Turbo Stream,只需要调整控制器的返回逻辑,让patch请求返回对应Turbo Frame的内容就行,步骤如下:

  1. 抽离Turbo Frame为局部视图
    把你索引页里的Turbo Frame代码单独放到局部视图app/views/events/_toggle_frame.html.erb里,避免重复代码:
<%= turbo_frame_tag dom_id(event, :toggle) do %>
  <%= button_to event_path(event), method: :patch, params: { event: { scheduled: !event.scheduled } }, class: "toggle-btn" do %>
    <%= event.scheduled ? "取消预约" : "预约活动" %>
  <% end %>
<% end %>

然后在索引页里引用这个局部:

<%= render 'toggle_frame', event: event %>
  1. 修改EventsController的update动作
    在update方法里判断是否是Turbo Frame发起的请求,是的话直接返回刚才的局部视图:
def update
  @event = Event.find(params[:id])
  if @event.update(event_params)
    # 针对Turbo Frame请求,返回单个frame内容
    if request.turbo_frame_request?
      render partial: 'events/toggle_frame', locals: { event: @event }, status: :ok
    else
      # 非Turbo请求保留原有重定向逻辑
      redirect_to events_path, notice: '活动状态已更新'
    end
  else
    # 处理更新失败的情况,比如返回编辑页
    render :edit
  end
end

private

def event_params
  # 注意参数要对应模型的scheduled属性,你原来模板里写的schedule是笔误
  params.require(:event).permit(:scheduled)
end

这样点击按钮后,Turbo会收到包含对应turbo_frame_tag的响应,自动替换页面上的目标Frame,就不会出现"Content Missing"了,完全符合你想要的「仅重新渲染更新后的Turbo Frame」的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 18:43:17