Rails - Как уничтожить пользователей, созданных под Devise?
Для моего приложения у меня есть учетные записи, которые люди могут зарегистрировать. Я использую devise
драгоценный камень для настройки.
У меня также есть страница пользователей, на которой перечислены все пользователи, зарегистрированные на сайте, а также destroy
ссылка на сайт. Я хочу, чтобы мой администратор мог удалять пользователей и перенаправлять их на страницу со списком пользователей. Но когда я нажимаю на ссылку, чтобы уничтожить конкретного пользователя, он просто перенаправляет на страницу профиля пользователя и не удаляет пользователя из базы данных.
Кто-нибудь знает почему?
** ОБНОВЛЕНИЕ: обновленный код ниже, как рекомендуется и работает сейчас.
users_controller.rb
def destroy
@user = User.find(params[:id])
@user.destroy
if @user.destroy
redirect_to root_url, notice: "User deleted."
end
end
пользователи /index.html.erb
<div class = "container">
<div id="usersview">
<b>USERS DIRECTORY</b>
<%= render @users %>
</div>
<center>
<%= will_paginate @users %>
</center>
</div>
пользователи / _user.html.erb
<div class="comments">
<%= link_to user.name, user %>
<% if current_user.try(:admin?) && !current_user?(user) %>
<%= link_to "Destroy", admin_destroy_user_path(user), method: :delete, data: { confirm: "You sure?" } %>
<% end %>
</div>
routes.rb
devise_for :users
match 'users/:id' => 'users#destroy', :via => :delete, :as => :admin_destroy_user
match 'users/:id' => 'users#show', as: :user
resources :users
4 ответа
Devise не предоставляет эту функциональность из коробки. Вы создали свое собственное действие уничтожения, но вам также нужно создать собственный маршрут к этому действию.
В ваших маршрутах:
match 'users/:id' => 'users#destroy', :via => :delete, :as => :admin_destroy_user
И тогда при создании ссылки:
<%= link_to "Destroy", admin_destroy_user_path(user), method: :delete, data: { confirm: "You sure?" } %>
В соответствии с разработанным 4.1 маршрутом рейка и просмотром, использование следующего поможет вам удалить учетную запись после входа в систему как пользователь.
<%= link_to "Cancel my account", registration_path(current_user), data: { confirm: "Are you sure?" }, method: :delete %>
Я думаю, что у вас есть в ваших маршрутах. resources :users
Проблема в том, что вы не передаете пользователя, которого хотите удалить при нажатии:
пользователи /_user.html.erb
<%= link_to "Destroy", user, method: :delete, data: { confirm: "You sure?" } %>
Смотрите, что во втором параметре я добавил пользователя вместо user_url.
users_controller.rb
def destroy
@user = User.find(params[:id])
if @user.destroy
redirect_to root_url, notice: "User deleted."
end
end
В контроллере я удалил @user.destroy. Вы звонили это дважды.
Надеюсь, поможет!
По крайней мере, последняя версия Завещания действительно обеспечивает такую функциональность из коробки, если Разрабатывают спинки модели:registerable
включены.
class User < ApplicationRecord
devise :database_authenticatable, :registerable
end
Где-то в app/views/layouts/application.html.erb
:
<%= link_to 'Delete my account', user_registration_path, method: :delete if user_signed_in? %>
Или из rails c вы можете сделать что-то вроде этого, где "x" - это идентификатор пользователя.
user = User.where(id: x)
user.destroy(1)