【问题标题】:rails - administrate + devise creating new users goes to devise controllerrails - 管理 + 设计创建新用户去设计控制器
【发布时间】:2020-06-08 17:37:43
【问题描述】:

我正在使用 rails administrate 开发一个 rails 应用程序。我有一个管理界面,其中包含一个由设计控制的名为admin_users 的资源。目前,用户实际上只在 Rails 控制台中创建,并且添加了设计以允许用户具有全身份验证功能。在该仪表板上,我想要一个选项来为我想邀请到应用程序中的其他用户创建 admin_users,因为这比在生产中从 rails 控制台执行此操作更容易。

我有一个控制器 Admin::AdminUsersController 来处理此功能以匹配仪表板。现在,它列出了系统中从 rails 控制台创建的当前 admin_users 并且工作正常。

现在,我添加了从 rails 管理界面创建管理员用户的选项。然而,在admin/admin_users/new 填写表格时,devise 似乎拦截了请求,并且似乎试图让我退出。查看我的 Rails 服务器,这里是日志

app_1  | Started POST "/admin/admin_users" for 192.168.96.1 at 2020-02-25 02:38:41 +0000
app_1  | Cannot render console from 192.168.96.1! Allowed networks: 127.0.0.0/127.255.255.255, ::1
app_1  | Processing by Devise::RegistrationsController#create as HTML
app_1  |   Parameters: {"authenticity_token"=>"LPbT7OCx8upC5ehWIZ1JV/o/UKttciyoThOgi06B4AUw8ve3x/stbjUT7Trvb9u0YMEoyEBobbbni0g7LNWvBg==", "admin_user"=>{"email"=>"test@somemail.com", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]", "reset_password_token"=>"[FILTERED]", "reset_password_sent_at"=>"[FILTERED]", "remember_created_at"=>""}, "commit"=>"Create Admin user"}
app_1  |   AdminUser Load (0.6ms)  SELECT "admin_users".* FROM "admin_users" WHERE "admin_users"."id" = $1 ORDER BY "admin_users"."id" ASC LIMIT $2  [["id", "2d795b9d-2b6f-4745-a58d-775076100c60"], ["LIMIT", 1]]
app_1  | Redirected to http://localhost:3000/
app_1  | Filter chain halted as :require_no_authentication rendered or redirected
app_1  | Completed 302 Found in 6ms (ActiveRecord: 0.6ms | Allocations: 2088)
app_1  | 
app_1  | 
app_1  | Started GET "/" for 192.168.96.1 at 2020-02-25 02:38:41 +0000
app_1  | Cannot render console from 192.168.96.1! Allowed networks: 127.0.0.0/127.255.255.255, ::1
app_1  | Processing by Rails::WelcomeController#index as HTML
app_1  |   Rendering /usr/local/bundle/gems/railties-6.0.2.1/lib/rails/templates/rails/welcome/index.html.erb
app_1  |   Rendered /usr/local/bundle/gems/railties-6.0.2.1/lib/rails/templates/rails/welcome/index.html.erb (Duration: 3.6ms | Allocations: 201)
app_1  | Completed 200 OK in 6ms (Views: 5.4ms | ActiveRecord: 0.0ms | Allocations: 1004)
app_1  | 

我无法让控制器触发我的Admin::AdminUsersController#create 操作。查看日志,它看起来像是在/admin/admin_users 到达我的发布路线,设计在Devise::RegistrationsController#create 拦截它,它从Filter chain halted as :require_no_authentication 停止,然后重定向到我的根路线,这与我注销时类似。

我什至在app/views/admin/admin_users/new.html.erb 添加了一个视图来覆盖管理员的默认视图,以触发表单转到我正在寻找的控制器操作,就像这样

<section class="main-content__body">
  <%= form_for([namespace, page.resource], :url => url_for(:controller => 'admin/admin_users', :action => 'create'), html: { class: "form" }) do |f| %>
    <% if page.resource.errors.any? %>
      <div id="error_explanation">
        <h2>
          <%= pluralize(page.resource.errors.count, "error") %>
          prohibited this <%= page.resource_name %> from being saved:
        </h2>

        <ul>
          <% page.resource.errors.full_messages.each do |message| %>
            <li class="flash-error"><%= message %></li>
          <% end %>
        </ul>
      </div>
    <% end %>

    <% page.attributes.each do |attribute| -%>
      <div class="field-unit field-unit--<%= attribute.html_class %>">
        <%= render_field attribute, f: f %>
      </div>
    <% end -%>

    <div class="form-actions">
      <%= f.submit %>
    </div>
  <% end %>

</section>

我也尝试在我的路线中添加我的devise_scope :admin_user,例如

devise_scope :admin_user do
  post "/admin/admin_users", to: 'admin/admin_users#create'
end

什么都没做。

我正在寻找的功能是当我在我的 admin_users 仪表板上时,使用我的 Admin::AdminUsersController#create 操作而不是 Devise::RegistrationsController#create 操作创建一个 admin_user。

有人知道我需要添加什么来启用它吗?

【问题讨论】:

  • 我已经按照您的描述创建了一个应用程序,但无法重现该问题。问题:您使用的是什么版本的 Rails? Admin::AdminUsersController 继承自哪个类? (应该是Admin::ApplicationController,然后是Administrate::ApplicationController。如果您从Devise::RegistrationsController 继承,则必须从Administrate::ApplicationController 复制功能)。你能提供一个带有复制品的回购吗?

标签: devise ruby-on-rails-6 administrate rails-administrate


【解决方案1】:

你尝试过命名空间吗?

namespace :admin do 
  devise_for :users
  # if the above doesn't work 
  # devise_for :admin_users
end

此外,您可以尝试使用必要的字段覆盖Administrate 基本控制器,如下所述:https://stackoverflow.com/a/59824297/1737811

【讨论】:

  • 与您发布的那个 stackoverflow 线程相关,我的 admin_user 资源的仪表板看起来与那个完全一样,这令人费解。在我的routes.rb 中,我的namespace :admin 上方有一个devise_for :admin_users, path: 'admin/admin_users'。问题似乎是当我post 我的表单时,post 被发送到Devise::RegistrationsController#create 而不是Admin::AdminUsersController#create。从添加路由到点击 URL 的自定义表单等,设计似乎仍在拦截我的帖子,而不是发送到我的 Admin::AdminUsersController
  • 嗯。这确实非常有趣。但是您是否尝试过devise_for :admin_users, controllers: {registrations: 'admin/admin_users/registrations}`,如他们的 wiki 所述:github.com/heartcombo/devise/wiki/…
  • controllers: { registrations: 'admin/admin_users' } 添加到我的devise_for :admin_users 中的routes.rb 对我有用。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多