簡體   English   中英

Rails 5 - Devise + Petergate - 管理員編輯其他用戶注冊

[英]Rails 5 - Devise + Petergate - Admin edit other user registration

我發現了一些相關的問題,但它們似乎不適用於我的案例,它們要么適用於舊版本,要么不適合我的方法。

我已經用設計建立了一個用戶模型,它有兩個相關的模型,它有一個聯系方式和許多地址。 我也有彼得蓋特來扮演角色。

我希望任何用戶都可以編輯他們的注冊(我在 app/views/devise/registrations/edit.html.erb 表單中添加了聯系方式和地址)並且管理員可以編輯所有內容。

聯系人詳細信息顯示頁面中的按鈕是這樣實現的:

<%= 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) 而不是用戶的編輯頁面。

如何編輯正確的用戶注冊路徑?

我的 routes.rb 文件包含以下內容:

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

我沒有讓用戶控制器覆蓋,我的模型不包含任何相關內容。

提前致謝!

您可以 CRUD 其他用戶的管理部分實際上並不是 Devise 的功能。

Devise RegistrationsController 是從頭開始構建的,僅適用於當前用戶。 路由實際上是單數的,不包含 id 段。 您必須覆蓋幾乎所有內容才能使其正常工作,並且在此過程中您正在推動單一職責原則。

如果您想 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

這實際上只是將復雜性推到了視圖層。 編輯自己的帳戶和其他人的帳戶不是一回事,視圖遲早會充滿條件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM