首页 > 解决方案 > 为 Devise 模型禁用注册时出错 - Devise | 导轨 5.2

问题描述

我正在开发一个带有两个 Devise 模型(AdminUser)的 Rails 5.2 项目。我已按照此Stack Overflow 答案的建议禁用 Devise 模型的注册,而不会破坏 Devise 的edit_admin_registration_path.

应用中建议的更改后routes.rb,运行rails routes显示更改按预期工作,但是当要编辑Admin( edit_admin_registration_path) 时,我收到错误:

NoMethodError in Admins::RegistrationsController#edit
undefined method `validatable?' for nil:NilClass

我怀疑问题在于链接的答案没有使用具有范围视图和控制器的多个设计模型。

有任何想法吗?

我已将此添加到routes.rb

devise_scope :admin do
  get "/sign_in" => "admins/sessions#new" # custom path to login/sign_in
  get "/sign_up" => "admins/registrations#new", as: "new_admin_registration" # custom path to sign_up/registration
end

devise_for :admins, skip: [ :registrations ], path: 'admins', controllers: { sessions: 'admins/sessions', registrations: 'admins/registrations' }
  as :admins do
    get 'admins/edit' => 'admins/registrations#edit', as: 'edit_admin_registration'
    put 'admins' => 'admins/registrations#update', as: 'admin_registration'
  end

查看表格:

<%= form_for(resource, as: resource_name, url: registration_path(resource_name), method: :put) do |f| %>
  <%= devise_error_messages! %>

  <%= f.label :email %><br />
  <%= f.email_field :email, autofocus: true, autocomplete: "email", class: "form-control" %>

  <% if devise_mapping.confirmable? && resource.pending_reconfirmation? %>
    <div>Currently waiting confirmation for: <%= resource.unconfirmed_email %></div>
  <% end %>

  <%= f.label :password %> <i>(leave blank if you don't want to change it)</i><br />
  <%= f.password_field :password, autocomplete: "off", class: "form-control" %>
  <% if @minimum_password_length %>
    <em><%= @minimum_password_length %> characters minimum</em>
  <% end %>

  <%= f.label :password_confirmation %><br />
  <%= f.password_field :password_confirmation, autocomplete: "off", class: "form-control" %>

  <%= f.label :current_password %> <i>(we need your current password to confirm your changes)</i><br />
  <%= f.password_field :current_password, autocomplete: "off", class: "form-control" %>

  <%= f.submit "Update", class: "btn btn-success" %>
<% end %>

标签: ruby-on-railsrubydeviserails-routing

解决方案


找到答案:

需要像这样配置路由(可以在这个 Stack Overflow 答案中找到):

devise_for :admins, :skip => [:registrations], path: 'admins', controllers: { sessions: 'admins/sessions', registrations: 'admins/registrations' }

devise_scope :admin do
  get 'admins/edit' => 'admins/registrations#edit', as: 'edit_admin_registration'
  put 'admins' => 'admins/registrations#update', as: 'admin_registration'
end

推荐阅读