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

Devise注册流程中「Next」按钮无法跳转至下一表单的问题

问题排查与修复方案

1. 验证失败无反馈,导致误以为按钮无响应

你的视图中未添加错误提示代码,当表单验证失败时,页面不会显示任何错误信息,看起来就像按钮点击后没反应。在表单中添加错误提示:

<% if @user.errors.any? %>
  <div id="error_explanation">
    <h2><%= pluralize(@user.errors.count, "error") %> 阻止用户信息保存:</h2>
    <ul>
    <% @user.errors.full_messages.each do |msg| %>
      <li><%= msg %></li>
    <% end %>
    </ul>
  </div>
<% end %>

2. 分步注册逻辑错误,重复创建用户

你的分步流程中每一步都新建User实例并保存,会导致创建多个用户,而非更新同一个用户。正确做法是第一步创建用户后,后续步骤基于已创建的用户更新:

修改后的控制器代码:

class Users::RegistrationsController < Devise::RegistrationsController
  def personal_info
    @user = User.new
    render 'devise/registrations/personal_info'
  end

  def create_personal_info
    @user = User.new(personal_info_params)
    if @user.valid?(:personal_info)
      if @user.save(validate: false)
        session[:user_id] = @user.id
        redirect_to new_user_registration_photo_path
      else
        render 'devise/registrations/personal_info'
      end
    else
      render 'devise/registrations/personal_info'
    end
  end

  def photo
    @user = User.find(session[:user_id])
    render 'devise/registrations/photo'
  end

  def create_photo
    @user = User.find(session[:user_id])
    if @user.update(photo_params) && @user.valid?(:photo)
      redirect_to new_user_registration_account_details_path
    else
      render 'devise/registrations/photo'
    end
  end

  def account_details
    @user = User.find(session[:user_id])
    render 'devise/registrations/account_details'
  end

  def create_account_details
    @user = User.find(session[:user_id])
    if @user.update(account_details_params) && @user.valid?(:account_details)
      session[:user_id] = nil
      sign_in(@user)
      redirect_to root_path
    else
      render 'devise/registrations/account_details'
    end
  end

  private

  def personal_info_params
    params.require(:user).permit(:name, :surname, :email, :phone, :birthday, :password, :password_confirmation)
  end

  def photo_params
    params.require(:user).permit(:photo)
  end

  def account_details_params
    params.require(:user).permit(:interests, :skillset, language_skills: [])
  end
end

3. 全局验证干扰分步流程

原代码中调用@user.save会触发模型所有验证,可能导致分步验证通过后全局验证失败。使用save(validate: false)跳过全局验证,仅保留分步验证逻辑,确保流程能按步骤推进。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 07:37:47