Rails 5-Devise + Petergate-管理员编辑其他用户注册

问题描述 投票:0回答:1

我发现了一些相关的问题,但它们似乎不适用于我的情况,它们适用于较旧的版本或不适合我的方法。

我已经设计出一个用户模型,它有两个相关模型,它有一个联系方式和许多地址。我也有Petergate担任角色。

我希望任何用户编辑他们的注册(我已经在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'
  }

我尚未使用户控制器覆盖,并且我的模型不包含任何相关内容。

提前感谢!

ruby-on-rails ruby devise ruby-on-rails-5
1个回答
0
投票

可以在其中管理其他用户的管理部分实际上不是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/_form.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 %>
<% 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

这实际上只是将复杂性降低到了视图层。编辑您自己的帐户和其他帐户不是同一回事,视图迟早会充满条件。

© www.soinside.com 2019 - 2024. All rights reserved.