ActiveAdmin自定义控制器覆写create方法后如何传递错误信息到视图
正确实现方案
你原有代码中使用User.create!会在验证失败时直接抛出异常,没有错误处理空间,修改后的代码如下:
controller do def create password_length = 8 password = Devise.friendly_token.first(password_length) local_params = permitted_params[:user].merge(password: password) @user = User.new(local_params) if @user.save # 保存成功逻辑,不需要返回初始密码可直接替换为super走默认逻辑 redirect_to admin_user_path(@user), notice: "用户创建成功,初始密码为:#{password}" else # 保存失败时存入错误信息,渲染新建页面 flash.now[:error] = @user.errors.full_messages.join("<br>").html_safe render :new end end end
核心注意点
- 避免使用带感叹号的
create!/save!方法,这类方法会在验证失败时直接抛出ActiveRecord::RecordInvalid异常,无判断处理空间;无感叹号的方法会返回布尔值标识操作结果,错误信息会自动写入实例的errors属性中 - 保存失败时必须使用
flash.now存储提示,而非普通flash:render :new不会触发新的HTTP请求,普通flash仅在下一次请求生效,当前页面无法展示 render :new会复用当前请求的@user实例变量,ActiveAdmin表单会自动将错误字段标记为异常状态,配合flash中的完整错误提示,用户可直观看到所有错误- 如果需要兜底捕获所有非验证类异常(比如数据库连接异常、运行时错误),可增加全局rescue块:
controller do def create password_length = 8 password = Devise.friendly_token.first(password_length) local_params = permitted_params[:user].merge(password: password) @user = User.new(local_params) if @user.save redirect_to admin_user_path(@user), notice: "用户创建成功,初始密码为:#{password}" else flash.now[:error] = @user.errors.full_messages.join("<br>").html_safe render :new end rescue => e flash.now[:error] = "创建用户失败:#{e.message}" render :new end end
内容的提问来源于stack exchange,提问作者Petros Kalafatidis
相关产品推荐
相关产品推荐

