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

Rails 7中如何使用Turbo/Stimulus插入新建记录的表单?

Rails 7 实现点击插入表单的官方规范方案

Turbo默认限制Turbo Stream处理GET请求是出于HTTP幂等性的设计约束,避免GET请求意外修改页面状态,针对你的需求有两种代码量极低的实现方式,完全可以对标原UJS的开发效率:


方案1:显式开启GET请求的Turbo Stream支持(改动最小,和原UJS逻辑最接近)

Turbo 7.1及以上版本原生支持对GET请求强制返回Turbo Stream响应,仅需要给链接加data-turbo-stream属性:

link_to 'add record', new_user_path, data: { turbo_stream: true }

控制器部分不需要额外修改,沿用你现有逻辑即可:

def new
  @user = User.new
  respond_to do |format|
     format.turbo_stream
  end
end

new.turbo_stream.erb的内容和你之前编写的完全一致:

<turbo-stream action='append' target="<%= dom_id @user %>_new_form">
  <template>
      ...the user form stuff...
  </template>
</turbo-stream>

整个实现和原UJS的代码量几乎没有差异,逻辑流程也完全一致。


方案2:使用Turbo Frame实现(更符合Turbo设计哲学,无需编写Stream模板)

如果是替换固定位置的内容,用Turbo Frame的方案更简洁,不需要编写Turbo Stream相关的逻辑:
首先在页面需要展示表单的位置插入Turbo Frame标签:

<%= turbo_frame_tag "#{dom_id(User.new)}_new_form" do %>
  <%= link_to 'add record', new_user_path %>
<% end %>

然后在new.html.erb视图中把表单内容包在同ID的Turbo Frame内:

<%= turbo_frame_tag "#{dom_id(@user)}_new_form" do %>
  ...the user form stuff...
<% end %>

点击链接后Turbo会自动发起请求,把返回的Frame内容替换到原页面的对应位置,全程不需要额外编写JS、控制器响应逻辑或者Stream模板。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 02:45:00