【问题标题】:Rails - How To Destroy Users Created Under Devise?Rails - 如何销毁在设计下创建的用户?
【发布时间】:2013-04-23 17:57:13
【问题描述】:

对于我的应用程序,我有用户可以注册的用户帐户。我使用devise gem 进行设置。

我还有一个用户页面,其中列出了所有注册到该站点的用户以及一个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

【问题讨论】:

    标签: ruby-on-rails destroy


    【解决方案1】:

    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?" } %>
    

    【讨论】:

    • 我更新了(请参阅已编辑的问题),但结果相同。不破坏和显示页面的路线。有没有可能我的路线顺序不对?
    • 尝试将自定义路由置于devise_for 调用之上。
    • 我认为你不需要resources :users
    • 我需要资源 :users for some "member do get:..." 但重新排序现在有效,请参阅上面有问题的更新代码。
    【解决方案2】:

    根据设计 4.1 rake 路由和视图,使用以下内容将帮助您在以用户身份登录后删除帐户。

    <%= link_to "Cancel my account", registration_path(current_user), data: { confirm: "Are you sure?" }, method: :delete %>
    

    【讨论】:

      【解决方案3】:

      我认为你的 routes.rb 中有:resources :users

      问题是点击时没有传递要删除的用户:

      用户/_user.html.erb

      <%= link_to "Destroy", user, method: :delete, data: { confirm: "You sure?" } %>
      

      看到在第二个参数中我添加了 user 而不是 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。你打了两次电话。

      希望对你有帮助!

      【讨论】:

        【解决方案4】:

        如果 Devise 支持的模型包含 :registerable,至少最新版本的 Devise确实提供了开箱即用的此类功能。

        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? %>
        

        【讨论】:

          【解决方案5】:

          或者从 rails c 你可以做这样的事情,其中​​“x”是用户 ID。

          user = User.where(id: x)
          user.destroy(1) 
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-05-20
            • 1970-01-01
            相关资源
            最近更新 更多