Раздел администратора, в котором вы можете CRUD другим пользователям, на самом деле не является функцией Devise.
Контроллер Devise RegistrationsController изначально создан для работы только для текущего пользователя. Маршруты на самом деле единичны и не содержат идентификатора. Вам придется переопределить почти все, чтобы заставить его работать, и в процессе вы запускаете принцип единой ответственности.
Если вы хотите использовать CRUD для других пользователей, просто создайте отдельный маршрут и контроллер, как и для любого другого ресурса. Вы можете просто запустить rails g scaffold_controller users
, чтобы создать один из них.
devise_for :users, controllers: {
registrations: 'my_registrations'
}
resources :users
Если вы хотите разделить код представления между регистрациями и вашим пользовательским контроллером, не пытайтесь повторно использовать ваше представление app/views/devise/registrations/edit.html.erb
. Вместо этого разбейте представление на части, которые можно использовать повторно.
# app/views/users/_fields.html.erb
<div>
<%= f.fields_for :contact_detail do |contact_detail|%>
<%= render "contact_detail_fields", f: contact_detail %>
<% end %>
</div>
<div>
<%= f.fields_for :addresses do |address_form| %>
<%= render "address_fields", f: address_form %>
<% end %>
</div>
# ...
# app/views/users/_form.html.erb
<%= form_for(user) do |f| >
<%= render "users/fields", f: f %>
<%= f.submit, class: "btn btn-primary" %>
<% end %>
# app/views/users/new/html.erb
<%= render "form", user: @user %>
# app/views/users/new/edit.erb
<%= render "form", user: @user %>
# app/views/devise/registrations/edit.html.erb
# This might be broken due to your earlier modifications so might want to
# regenerate the views
<h2>Edit <%= resource_name.to_s.humanize %></h2>
<%= form_for(resource, as: resource_name, method: :put do|f| %>
<%= render "users/fields", f: f %>
<div class="form-group">
<%= f.submit "Update", class: "btn btn-primary" %>
</div>
<% end %>
Хотя вы можете явно отобразить другое представление, передав путь в контроллере:
class UsersController < ApplicationController
def edit
@user = User.find(params[:id])
render 'devise/registrations/edit',
locals: { resource: @user, resource_name: :user }
end
end
Это на самом деле только увеличивает сложность вниз в слой представления. Редактирование вашей собственной учетной записи и учетной записи другого лица - это не одно и то же, и представление рано или поздно закончится условиями.