【问题标题】:How to delete / destroy user in rails app from database?如何从数据库中删除/销毁rails应用程序中的用户?
【发布时间】:2014-07-08 06:04:10
【问题描述】:

我最近观看了 railscast 剧集#250 Authentication from Scratch (revised),并且我的注册/登录/注销操作正常工作。但是,我正在创建一个从数据库中删除用户的操作,但是当我尝试删除用户时,我目前遇到了一些错误。

users_controller.rb 删除/销毁操作如下所示,

def delete
    # the below line calls the destroy method / action
    self.destroy
  end

  def destroy
    session[:user_id] = nil
    # @user = User.find(params[:id])
    @user.destroy
    # User.find(parmas[:id]).destroy
    # the below line didn't delete the current user :(
    # @user = User.destroy
    redirect_to :controller=>'users', :action => 'new'
  end

当我尝试删除用户时,我在浏览器中收到的错误消息如下所示。

包含删除链接的页面如下所示,index.html.erb

<h1>Welcome 
    <% if current_user %>
        <%= current_user.email %>
    <% end %>
</h1>

<p>You have <%= current_user.credit %> credits.</p>

<!-- http://stackoverflow.com/questions/5607155/ -->
<%= link_to('Delete your account', :controller => 'users', :action => 'destroy') %>

routes.rb

Rails.application.routes.draw do

  # the below generated route is not necessary
  # get 'sessions/new'

  # delete user route
  #get 'delete' => 'users#delete'

  # shortened routes, per railscast comment
  get 'signup' => 'users#new'
  get 'login' => 'sessions#new'
  get 'logout' => 'sessions#destroy'

  # get 'signup', to: 'users#new', :as 'signup'
  # get 'login', to: 'sessions#new', :as 'login'
  # get 'logout', to: 'sessions#destroy', :as 'logout'

  resources :users
  resources :sessions

  root to: 'users#new'

  # get 'users/new'

  # the below line specifies JSON as the default API format
  namespace :api, defaults: {format: 'json'} do
    namespace :v1 do
      resources :users
    end
  end

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4


    【解决方案1】:

    你得到一个 NoMethodError 是理所当然的,因为你从来没有设置过 @user 变量,那一行被注释掉了:

     def destroy
        session[:user_id] = nil
        # @user = User.find(params[:id]) <-- Commenting out this line was your problem
        @user.destroy
    

    改成

     def destroy
        session[:user_id] = nil
        @user = User.find(params[:id])
        @user.destroy
    

    你应该很高兴。

    编辑:您可能想做的一件事是从使用旧样式的 link_to 更改,指定控制器和操作,并更改为使用 route helpers 的新样式。在这种情况下,我相信你会使用link_to 'Delete your account', current_user, :method =&gt; :delete,但你可以通过运行rake routes 来检查,它会根据你的 routes.rb 文件列出可用的助手。

    【讨论】:

    • index.html.erb 中的上述行更改为&lt;%= link_to 'Delete your account', users_path, :method =&gt; :delete %&gt; 但现在我收到以下错误No route matches [DELETE] "/users"
    • rake routes的输出是什么,具体是和用户相关的部分?
    • 添加了参数,我得到了同样的错误:/
    • 另外我认为应该是users_path 而不是user_path
    【解决方案2】:

    嗯,我认为你应该让事情变得更简单一些,从最愚蠢的事情开始,这样行得通。首先,如果您将控制器用作资源,则那里不会有删除操作,只有销毁。

    def destroy
      User.find(params[:id]).destroy
      session[:user_id] = nil
      redirect_to new_user_path
    end
    

    附:再一次,我假设您在您的routes.rb 中设置了resources :users
    如果您有一堆 get|post|put|delete 路由,请确保正确指向重定向。

    【讨论】:

    • 为了清楚起见,我修改了我的问题。我还按照您的描述重写了我的销毁操作,但仍然出现错误。没有路由匹配 {:action=>"destroy", :controller=>"users"}
    • 请发布您的routes.rb 文件
    • 发布了routes.rb文件
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-23
    • 2015-06-01
    • 2017-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多