Ruby on rails Rails 5-设计+管理-编辑其他用户注册

Ruby on rails Rails 5-设计+管理-编辑其他用户注册,ruby-on-rails,ruby,devise,ruby-on-rails-5,Ruby On Rails,Ruby,Devise,Ruby On Rails 5,我发现了一些相关的问题,但它们似乎不适用于我的案例,它们要么适用于旧版本,要么不适合我的方法 我用Desive建立了一个用户模型,它有两个相关的模型,它有一个联系人详细信息和多个地址。我也有彼得盖特来演角色 我希望任何用户都可以编辑他们的注册。我已经在app/views/design/registrations/edit.html.erb表单中添加了联系人详细信息和地址,管理员可以编辑所有信息 联系人详细信息显示页面中的按钮实现如下: 编辑表单如下所示 h2>Edit <%= res

我发现了一些相关的问题,但它们似乎不适用于我的案例,它们要么适用于旧版本,要么不适合我的方法

我用Desive建立了一个用户模型,它有两个相关的模型,它有一个联系人详细信息和多个地址。我也有彼得盖特来演角色

我希望任何用户都可以编辑他们的注册。我已经在app/views/design/registrations/edit.html.erb表单中添加了联系人详细信息和地址,管理员可以编辑所有信息

联系人详细信息显示页面中的按钮实现如下:

编辑表单如下所示

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>
我没有做用户控制器覆盖,我的模型也没有包含任何相关的内容


提前谢谢

一个可以对其他用户进行CRUD的管理部分实际上并不是Deviate的功能

DeVICE RegistrationController从头开始构建,只为当前用户工作。这些路由实际上是单数的,不包含id段。你必须覆盖几乎所有的东西才能让它工作,在这个过程中,你正在推进单一责任原则

如果您想对其他用户进行CRUD,只需创建一个单独的路由和控制器,就像您对任何其他资源所做的那样。您只需运行railsgscaffold\u控制器用户来构建一个

devise_for :users, controllers: {
  registrations: 'my_registrations'
}
resources :users
如果您想在注册和用户控制器之间共享视图代码,请不要尝试回收您的应用程序/视图/设计/注册/编辑.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

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

好的,我明白了逻辑。然后,我应该把edit_用户_path@contact_detail.user在按钮上,它将引导我进入/users/10/edit,例如。但是注册编辑表单不会呈现,它会重定向到app/views/user/edit.html.erb文件,对吗?我应该创建此文件,然后在那里呈现表单,还是有更好的方法呈现注册编辑表单?方法是什么?使用partials,而不是在用户表单和注册表单之间共享字段代码。不要试图把任何设计的东西塞进这里面。设计代码真的太复杂了,因为它需要做的假设太少。对不起,我不太理解你最后的评论。你能简单一点吗?你能带我走一下我需要走的路吗?我不应该使用我将创建的应用程序/视图/用户/编辑文件上的注册表?是的,这正是我要说的。我用例子编辑了这个问题。非常感谢你的回答!
class UsersController < ApplicationController
  def edit
    @user = User.find(params[:id])
    render 'devise/registrations/edit', 
      locals: { resource: @user, resource_name: :user }
  end
end