[英]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.