Rails Turbo Frames点击按钮后‘内容缺失’问题的极简解决咨询
解决Turbo Frame更新后显示"Content Missing"的问题
你的思路没问题,不用自定义路由也不用Turbo Stream,只需要调整控制器的返回逻辑,让patch请求返回对应Turbo Frame的内容就行,步骤如下:
- 抽离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 %>
- 修改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
相关产品推荐
相关产品推荐

