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

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:重定向到感谢页面

  1. 修改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
  1. 添加路由:
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
  1. 创建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流直接更新页面内容

  1. 在表单页面给容器添加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>
  1. 修改create方法,渲染Turbo流替换容器内容:
def create 
    # 可先处理用户创建逻辑
    render turbo_stream: turbo_stream.update("registration-container", "Thanks for registering!")
end

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 09:50:45