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
相关产品推荐
相关产品推荐

