我发现了一些相关的问题,但它们似乎不适用于我的情况,它们适用于较旧的版本或不适合我的方法。
我已经设计出一个用户模型,它有两个相关模型,它有一个联系方式和许多地址。我也有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'
}
我尚未使用户控制器覆盖,并且我的模型不包含任何相关内容。
提前感谢!
可以在其中管理其他用户的管理部分实际上不是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
这实际上只是将复杂性降低到了视图层。编辑您自己的帐户和其他帐户不是同一回事,视图迟早会充满条件。