рельсы - администрирование + разработка создания новых пользователей идет на разработку контроллера

Я работаю над приложением rails, используя rails administrate. У меня есть интерфейс администратора с ресурсом под названием admin_users, которым управляет devise. Прямо сейчас пользователи действительно создаются только в консоли rails, и было добавлено устройство devise, позволяющее пользователям иметь возможность omniauth. На этой панели мне нужна возможность создавать admin_users для дополнительных пользователей, которых я хочу пригласить в приложение, поскольку это проще, чем делать это из консоли rails в продакшене.

У меня есть контроллер Admin::AdminUsersController для обработки этой функции в соответствии с приборной панелью. прямо сейчас он перечисляет текущих admin_users в системе, которые были созданы из консоли rails, и это прекрасно работает.

Теперь я добавляю возможность создавать пользователей-администраторов из интерфейса администрирования rails. Однако при заполнении формы на admin/admin_users/new кажется, что devise перехватывает запрос и пытается выйти из системы. Глядя на мой сервер рельсов, вот журналы

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"=>"[email protected]", "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 перехватывает его на 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_user, используя мое действие Admin::AdminUsersController#create вместо действия Devise::RegistrationsController#create.

Кто-нибудь знает, что мне нужно добавить, чтобы включить это?


person James N    schedule 25.02.2020    source источник
comment
Я создал приложение, как вы описываете, но не смог воспроизвести проблему. Вопросы: какую версию Rails вы используете? От какого класса наследуется Admin::AdminUsersController? (это должно быть Admin::ApplicationController и, в свою очередь, Administrate::ApplicationController. Если вместо этого вы унаследуете от Devise::RegistrationsController, вам придется воспроизвести функциональность от Administrate::ApplicationController). Можете ли вы предоставить репо с репродукцией?   -  person pablobm    schedule 29.02.2020


Ответы (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 с нужными полями.

person mutantkeyboard    schedule 25.02.2020
comment
в связи с тем потоком stackoverflow, который вы опубликовали, моя панель для моего admin_user ресурса выглядит точно так же, что и вызывает недоумение. В моем routes.rb у меня devise_for :admin_users, path: 'admin/admin_users' над моим namespace :admin. Проблема, кажется, в том, что когда я post свою форму, post отправляется Devise::RegistrationsController#create вместо Admin::AdminUsersController#create. от добавления маршрутов к настраиваемой форме, попадающей в URL-адрес и т. д., devise, похоже, все еще перехватывает мой пост вместо того, чтобы он перешел в мой Admin :: AdminUsersController - person James N; 25.02.2020
comment
Хм. Это действительно очень интересно. Но попробовали ли выdevise_for :admin_users, controllers: {registrations: 'admin/admin_users/registrations} `, как описано в их вики: github .com / heartcombo / devise / wiki /. - person mutantkeyboard; 25.02.2020
comment
добавление controllers: { registrations: 'admin/admin_users' } к моему devise_for :admin_users в моем routes.rb сработало для меня. Благодарность! - person James N; 25.02.2020