2014-01-29 86 views
1

我的設計寶石出現問題。當我與用戶註銷時,devise將我的用戶從我的mysql數據庫中刪除。我昨天首先發現了這個錯誤,然後纔開始工作。我不記得什麼註冊和登錄也是可能的。Rails devise在註銷後從數據庫中刪除用戶

用戶控制器

class UsersController < ApplicationController 
def show 
@user = User.find(params[:id]) 

respond_to do |format| 
    format.html # show.html.erb 
    format.json { render json: @user } 
end 
end 

def destroy 
@user = User.find(params[:id2]) 
    @user.destroy 
respond_to do |format| 
    format.html { redirect_to root_url} 

end 
end 

end 

註銷-Link的

<%= link_to " Logout", destroy_user_session_path(:id2 => current_user.id), :class => "btn btn-danger icon-share-alt ",:style=>"font-family: FontAwesome;font-weight: bold;color:black", :method => :delete %> 

用戶模型

class User < ActiveRecord::Base 
rolify 
belongs_to :ressourcen 

devise :database_authenticatable, :registerable, 
    :recoverable, :rememberable, :trackable, :validatable 

attr_accessible :vorname, :nachname, :email, :password, :password_confirmation, :roleid,:id 

validates :email, :uniqueness => true 

回答

0

你定製/覆蓋色器件會議控制器?

如果不是你的註銷鏈接或許應該是這樣的:

<%= link_to " Logout", destroy_user_session_path, :class => "btn btn-danger icon-share-alt ",:style=>"font-family: FontAwesome;font-weight: bold;color:black", :method => :delete %> 

設計不知道:id2參數是什麼。

+0

不幸的是,這也不起作用。我也認爲我沒有會話控制器...只是一個User_controller。當我使用不帶參數的「destroy_user_session_path」時,控制器如何找到用戶? – user3250164

+0

看一下[會話控制器源代碼](https://github.com/plataformatec/devise/blob/master/app/controllers/devise/sessions_controller.rb)。它調用[sign_out here](https://github.com/plataformatec/devise/blob/master/lib/devise/controllers/sign_in_out.rb)。 Devise知道current_user – mikeorr85

0

嘗試更換此:

destroy_user_session_path 

與此:

destroy_session_path(:user_id => current_user.id) 

,比SessionsController摧毀你的會話。這樣,每當有人點擊註銷鏈接時,你都會毀掉你的用戶。

+0

「找不到id = sign_out的用戶」 – user3250164

+0

某處您正在向User.find函數傳遞「sign_out」。嘗試在控制檯中運行rake路由並查看** destroy_session_path **帶你到哪裏。 – ObiVanKaPudji

1

這似乎很奇怪。如果設計和路線是以默認的方式設置的,我看不出這是怎麼發生的。這是什麼:

rake routes 

向您顯示destroy_user_session_path?如果你還沒有覆蓋色器件的SessionsController,並沒有改變色器件的路線,爲destroy_user_session的唯一入口應該是這個樣子:

destroy_user_session DELETE /users/sign_out(.:format) devise/sessions#destroy 

它絕對不應該去你的UsersController的。它應該去設計的SessionsController。

在任何情況下,這種註銷鏈接的作品對我來說:

<%= link_to "Sign out", destroy_user_session_path, :method => :delete %> 

destroy_user_session_path應該不需要用戶ID。它只會破壞會話中的用戶,所以不需要id。

更新:

當您註銷時,您返回哪個頁面?如果你自己沒有定義SessionsController並且沒有覆蓋after_sign_out_path(),它應該嘗試返回到root_path。如果您的路由中沒有定義根,它將返回到「/」。您能否從日誌文件(例如development.log)中確認您點擊「註銷」鏈接時發生的情況?哪些操作被調用以及什麼時候/什麼SQL查詢被調用?就在您點擊鏈接時,而不是在您稍後瀏覽以查看用戶時。另外,你的routes.rb中的devise_for行是什麼樣的?當你只點擊註銷鏈接時,就值得深入瞭解發生了什麼。

據我所知,devise裏面唯一可以從數據庫中刪除用戶的東西是RegistrationsController.destroy(),如果DELETE請求被髮送給/ users(沒有id),它將被調用。它會從會話中找到當前登錄的用戶(這就是爲什麼它不需要id)並銷燬它們。在標準設計視圖中,它看起來像只能從devise/registrations/edit.html.erb調用,並且可能你沒有這樣做。

+0

'destroy_user_session DELETE /users/sign_out(.:format)devise/sessions#destroy' destroy_user_session正在使用GET-Path ..我改變了它,但它也不起作用。用戶控制器仍然沒有找到用戶。 – user3250164

+0

查看我更新的答案;希望那裏有一些有用的指針。 – Tim

相關問題