Rails 4.2.10升级后用Sorcery Gem注册用户遇email字段无默认值错误
Mysql2::Error: Field 'email' doesn't have a default value错误 这个报错的核心原因很明确:你的create动作在创建User记录时,没有传入email字段的值,而数据库里email字段被设置为非空(NOT NULL)且没有默认值,所以MySQL拒绝执行插入操作。
结合你从Rails 3.2升级到4.2的背景,最大的可能是Strong Parameters(强参数)的配置问题——Rails 4之后废弃了Rails 3里的attr_accessible,改用强参数来控制允许传入的参数,如果你没正确配置,就会导致表单提交的email等参数被过滤掉,最终只插入了created_at和updated_at这两个自动生成的字段。
下面是具体的解决步骤:
第一步:检查并修复UsersController的强参数配置
在你的UsersController里,需要添加一个私有方法来定义允许的用户参数,确保包含email、password等注册必需字段:class UsersController < ApplicationController def create @user = User.new(user_params) # 这里一定要用user_params,而不是直接用params[:user] if @user.save # 注册成功后的逻辑,比如登录、跳转 else render :new end end private def user_params params.require(:user).permit(:email, :password, :password_confirmation) # 根据你的需求添加其他需要的字段,比如username等 end注意:要确保create动作里是用
user_params来初始化User对象,而不是未过滤的params[:user],否则Rails会自动过滤掉未被允许的参数。第二步:确认Sorcery的配置正确性
打开config/initializers/sorcery.rb,检查Sorcery的用户配置块,确保指定了正确的email字段:Rails.application.config.sorcery do user_class User user_config do email_attribute_name :email # 确认这里是你数据库里的email字段名 # 其他Sorcery配置... end end第三步:验证表单提交的参数格式
确保你的注册表单里,email输入框的name属性是user[email],比如ERB模板里的代码应该是:<%= form_for @user do |f| %> <%= f.label :email %> <%= f.email_field :email %> <!-- 其他表单字段 --> <% end %>这样表单提交的参数才会被封装到
params[:user]里,才能被强参数方法正确获取。额外检查:数据库字段配置
如果你确认参数没问题,但还是报错,可以检查数据库里users表的email字段是否确实设置为NOT NULL。如果是你不需要强制非空,可以修改数据库迁移把它改成允许为空,但通常注册时email是必填的,所以更建议确保参数正确传入。
内容的提问来源于stack exchange,提问作者uberdave

