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

Rails Admin自定义控制器创建管理员时路由报错求助

问题描述

我正在使用rails_admin gem搭建管理后台,同时搭配devise gem,想要创建一个自定义控制器,仅通过email字段创建新管理员。但使用rails_admin_form_for时出现以下错误:

ActionView::Template::Error (undefined method `admin_registration_path' for #ActionView::Base:0x0000000000e470

视图代码

<%= rails_admin_form_for @object, url: admin_registration_path(model_name: @abstract_model.to_param) do |f| %>
  <%= f.label :email %>
  <%= f.email_field :email %>

  <%= f.submit "Sign up" %>
<% end %>

控制器代码

require 'rails_admin/config/actions'
require 'rails_admin/config/actions/base'

module RailsAdmin
  module Config
    module Actions
      class NewAdmin < RailsAdmin::Config::Actions::Base
        RailsAdmin::Config::Actions.register(self)

        register_instance_option :collection do
          true
        end

        # 自定义按钮图标
        register_instance_option :link_icon do
          'fas fa-user-plus'
        end

        register_instance_option :http_methods do
          %i[get post]
        end

        register_instance_option :controller do
          proc do
            if request.get?
              @object = @abstract_model.new
              @action = @action.with(@action.bindings.merge(object: @object))
              @authorization_adapter&.attributes_for(:new, @abstract_model)&.each do |name, value|
                @object.send("#{name}=", value)
              end
              object_params = params[@abstract_model.param_key]
              if object_params
                sanitize_params_for!(request.xhr? ? :modal : :create)
                @object.assign_attributes(@object.attributes.merge(object_params.to_h))
              end
              respond_to do |format|
                format.html { render @action.template_name }
              end
            elsif request.post?
              puts "Action: #{@action}"
            end
          end
        end
      end
    end
  end
end

我参考了rails_admin官方的new.rb实现,路由截图显示包含rails_admin的相关路由,但未看到admin_registration_path相关路由。请问我哪里操作有误,或是有更优的实现方式?


解决方案

错误原因

admin_registration_path是Devise提供的前台注册路由,但你当前是在RailsAdmin后台的自定义动作中使用,该路由并不存在于后台路由体系里,因此触发报错。

修复步骤

1. 修正表单提交路径

将表单的url参数替换为RailsAdmin自定义动作的路径,可直接利用@action对象获取正确路径:

<%= rails_admin_form_for @object, url: @action.url do |f| %>
  <%= f.label :email %>
  <%= f.email_field :email %>

  <%= f.submit "Sign up" %>
<% end %>

2. 完善POST请求处理逻辑

控制器的POST分支仅做了打印操作,需补充管理员创建逻辑,同时结合Devise要求处理密码字段(Devise用户必须设置密码):

elsif request.post?
  # 提取并过滤email参数
  object_params = params.require(@abstract_model.param_key).permit(:email)
  # 生成随机初始密码
  random_password = Devise.friendly_token.first(8)
  @object = @abstract_model.new(object_params.merge(
    password: random_password,
    password_confirmation: random_password
  ))
  
  if @object.save
    # 保存成功后跳转列表页并提示
    redirect_to rails_admin.index_path(model_name: @abstract_model.to_param), 
                notice: "管理员创建成功,初始密码:#{random_password}"
  else
    # 保存失败重新渲染表单
    respond_to do |format|
      format.html { render @action.template_name }
    end
  end

更优实现方式

无需自定义动作,直接修改RailsAdmin中Admin模型的配置,隐藏除email外的字段并自动生成密码即可:
在config/initializers/rails_admin.rb中添加:

config.model 'Admin' do
  create do
    field :email
    # 隐藏密码字段并自动生成默认值
    configure :password do
      visible false
      default_value { Devise.friendly_token.first(8) }
    end
    configure :password_confirmation do
      visible false
      default_value { Devise.friendly_token.first(8) }
    end
  end
end

这样直接使用RailsAdmin自带的新建功能,就能只显示email字段,自动处理密码创建,无需额外自定义代码,更简洁可靠。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 11:35:06