Ruby on Rails问题:点击提交按钮后表单无法加载registration#create模板
Rails表单提交后无跳转、不显示感谢信息的解决方案
问题核心
Rails 7及以上版本默认启用Turbo,form_with会默认发起Turbo Stream请求,而非传统的HTML请求。这种情况下,直接render plain: "Thanks"无法在页面显示内容——Turbo期望处理流响应,而非替换整个页面;若移除render代码,Rails会因找不到create模板返回204 No Content。
另外,表单代码里的form_with module: @user是笔误,正确参数应为model: @user,否则表单参数结构错误,后续无法正常创建用户。
解决方案
方案1:禁用Turbo,改用传统表单提交
给form_with添加data: { turbo: false },强制表单走传统HTTP POST流程,这样render plain会直接输出内容到页面。
修改后的表单代码:
<div class="d-flex align-items-center justify-content-center"> <h1> Registration </h1> </div> <%= form_with model: @user, url: sign_up_path, data: { turbo: false } do |form| %> <div class="mb-3"> <%= form.label :email%> <%= form.text_field :email, class:"form-control", placeholder:"Example@gmail.com"%> </div> <div class="mb-3"> <%= form.label :password%> <%= form.password_field :password, class:"form-control", placeholder:"Password"%> </div> <div class="mb-3"> <%= form.label :password_confirmation%> <%= form.password_field :password_confirmation, class:"form-control", placeholder:"Password"%> </div> <div class="mb-3"> <%= form.submit "Register", class:"btn btn-primary"%> </div> <% end %>
此时create方法的render plain: "Thanks"会正常显示在页面上。
方案2:保留Turbo,用重定向或Turbo流响应
如果想保留Turbo的无刷新特性,有两种方式:
方式A:重定向到感谢页面
- 修改
RegistrationController的create方法:
class RegistrationController < ApplicationController def new @user = User.new end def create # 先处理用户创建逻辑(示例) # @user = User.new(user_params) # if @user.save redirect_to thank_you_path, notice: "注册成功!" # else # render :new # end end def thank_you end end
- 添加路由:
Rails.application.routes.draw do root to: "main#index" get "about", to: "about#index" get "sign_up", to: "registration#new" post "sign_up", to: "registration#create" get "thank_you", to: "registration#thank_you" # 新增路由 end
- 创建
app/views/registration/thank_you.html.erb页面:
<div class="d-flex align-items-center justify-content-center flex-column"> <h1>Thanks for registering!</h1> <%= link_to "返回首页", root_path %> </div>
方式B:用Turbo流直接更新页面内容
- 在表单页面给容器添加ID:
<div id="registration-container" class="d-flex align-items-center justify-content-center flex-column"> <h1> Registration </h1> <%= form_with model: @user, url: sign_up_path do |form| %> <!-- 表单内容不变 --> <% end %> </div>
- 修改
create方法,渲染Turbo流替换容器内容:
def create # 可先处理用户创建逻辑 render turbo_stream: turbo_stream.update("registration-container", "Thanks for registering!") end
内容的提问来源于stack exchange,提问作者ProgrammerUndead
相关产品推荐
相关产品推荐

