Я работаю над проектом Rails 5.2 с двумя моделями Devise (Admin
и User
). Я следовал предложению в этом ответе переполнения стека , чтобы отключить регистрацию для модели Devise, не нарушая edit_admin_registration_path
.
Devise.
После применения изменений, предложенных в routes.rb
, запуск rails routes
показывает, что изменения работают должным образом, однако при редактировании Admin
(edit_admin_registration_path
) я получаю ошибку:
NoMethodError in Admins::RegistrationsController#edit
undefined method `validatable?' for nil:NilClass
Я подозреваю, что проблема заключается в том, что связанный ответ не использовал несколько моделей Devise с областями видимости и контроллерами.
Есть идеи?
Я добавил это к 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 %>