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) 
Другие вопросы по тегам