Rails 5 - Devise + Petergate - Admin редактировать регистрацию других пользователей - PullRequest
0 голосов
/ 24 января 2020

Я нашел несколько связанных вопросов, но они, похоже, не работают для моего случая, они либо для более старых версий, либо не соответствуют моему подходу.

Я настроил модель User с помощью devise и у него есть две связанные модели, у него есть одна контактная информация и много адресов. У меня также есть Petergate для получения ролей.

Я хочу, чтобы любой пользователь мог редактировать свою регистрацию (я добавил контактную информацию и адреса в app / views / devise / registrations / edit. html .erb form) и администратор может редактировать все.

Кнопка на странице отображения контактной информации реализована следующим образом:

<%= link_to 'Edit Profile', edit_user_registration_path(@contact_detail.user) if logged_in?(:admin) || current_user.id == @contact_detail.user_id %>

, а форма редактирования следующая

h2>Edit <%= resource_name.to_s.humanize %></h2>

<%= form_for(resource, as: resource_name, url: user_registration_path(resource_name), html: { method: :put }) do |f| %>
...
...
  <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>

  <div class="form-group">
    <%= f.submit "Update", class: "btn btn-primary" %>
  </div>

Но когда я нажимаю кнопку на странице контактной информации пользователя, я всегда перенаправляю на страницу редактирования администратора (/users/edit.1), а не на страницу редактирования пользователя.

Как я могу изменить правильный путь регистрации пользователя?

В моем файле rout.rb есть следующее:

  resources :addresses
  resources :contact_details
  devise_for :users, controllers: {
    registrations: 'my_registrations'
  }

Я не сделал переопределение контроллера пользователя, и мои модели не содержат ничего актуально.

Заранее спасибо!

1 Ответ

1 голос
/ 24 января 2020

Раздел администратора, в котором вы можете 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

Это на самом деле только увеличивает сложность вниз в слой представления. Редактирование вашей собственной учетной записи и учетной записи другого лица - это не одно и то же, и представление рано или поздно закончится условиями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...