2014-07-07 1 views
0

나는 최근에 railscast 에피소드 #250 Authentication from Scratch (revised)을 봤고 나는 signup/login/logout 작업을했습니다. 그러나 나는 데이터베이스에서 사용자를 삭제하는 작업을 만들고 있지만 현재 사용자를 삭제하려고하면 몇 가지 오류가 발생합니다.데이터베이스에서 rails 앱의 사용자를 삭제/삭제하는 방법은 무엇입니까?

삭제/파괴 행위는 다음과 같이 보는 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 

나는 사용자가 다음과 같은 삭제하려고하면 브라우저에서지고있어 오류 메시지입니다.

enter image description here

삭제 링크는 다음과 같습니다가 포함 된 페이지, 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 

답변

2
그것은 당신이 @user 변수를 설정 적이 있기 때문에, 당신이 NoMethodError을 얻고 추론하기 위하여 서

은, 그 라인은 주석 :

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 

에 잘 가라.

편집 : 컨트롤러 및 동작을 지정하고 route helpers을 사용하여 새 스타일로 변경하여 link_to의 이전 스타일을 사용하는 것으로 변경하고 싶을 것입니다. 이 경우 link_to 'Delete your account', current_user, :method => :delete을 사용하지만 rake routes을 실행하여 확인할 수 있습니다. 여기에서 routes.rb 파일을 기반으로 사용할 수있는 도우미가 나열됩니다.

+0

위의 행을'index .html.erb'을 다음과 같이 수정합니다. '<% = link_to'계정을 삭제하십시오., users_path, : method => : delete %>'이제 경로에 [DELETE]가 일치하지 않습니다. "/ users "' – Chris

+0

'rake routes'의 결과는 무엇입니까? 특히 사용자와 관련된 부분은 무엇입니까? – ABMagil

+0

https://ghostbin.com/paste/zqvv8 – Chris

1

글쎄, 난 당신이 일을 좀 더 단순하게 만들어야하고, 더러운 일부터 시작해야한다고 생각합니다. ks. 우선, 컨트롤러로 리소스를 사용하면 거기에 삭제 작업이 없으며 삭제 만됩니다.

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

P. 다시 한번 귀하의 routes.rbresources :users을 설정했다고 가정합니다.
get|post|put|delete 개의 경로가있는 경우 리디렉션이 올바르게 지정되어 있는지 확인하십시오.

+0

명확성을 위해 제 질문을 수정했습니다. 내가 묘사 한 것처럼 파괴 행동을 다시 작성했지만 여전히 오류가 발생합니다. 경로가 일치하지 않습니다 : : action => "destroy", : 컨트롤러 => "users"} – Chris

+0

'routes.rb' 파일을 게시하십시오 – ABMagil

+0

은 routes.rb 파일을 게시했습니다 – Chris

관련 문제