2010-11-04 36 views
12

我已經用我的設計模型實現了omniauth,所以我可以使用其他服務進行身份驗證。 我的模型不再需要密碼,因爲用戶可以使用twitter,facebook進行身份驗證...Rails 3 - 設計:如何在編輯註冊時跳過'current_password'?

一切工作正常,但是,當用戶嘗試編輯其註冊時,請設計跳過該過程,因爲用戶沒有通知'current_password'(現在在某些情況下不存在)。

我創建了一個登記控制器覆蓋圖謀之一:

class RegistrationsController < Devise::RegistrationsController 
    def update 
    super 
    end 
end 

但我還沒有找到如何跳過密碼驗證的任何文件,我怎麼能做到這一點在我的更新動作?

回答

34

上面類似,嘗試把這個在您的用戶模型:

# bypasses Devise's requirement to re-enter current password to edit 
def update_with_password(params={}) 
    if params[:password].blank? 
    params.delete(:password) 
    params.delete(:password_confirmation) if params[:password_confirmation].blank? 
    end 
    update_attributes(params) 
end 
+0

真的很不錯。完美的作品! – Tronic 2011-04-14 16:02:16

+0

它的工作原理!謝謝你,我愛你! – rodrigoalves 2012-08-02 17:05:55

+4

向'clean_up_passwords'添加一個調用可能是值得的。保存後,它將'password'和'password_confirmation'屬性設置爲nil以保護用戶的密碼。請參閱Devise的[update_with_password實現](https://github.com/plataformatec/devise/blob/master/lib/devise/models/database_authenticatable.rb#L56)以供參考。 – 2012-10-05 17:56:59

10

以下爲我工作:

在我的用戶控制,在更新的動作,我有

params[:user].delete(:password) if params[:user][:password].blank? 
params[:user].delete(:password_confirmation) if params[:user][:password_confirmation].blank? 

也許你能適應,爲一個before_save回調?

1

即使答案已經在這裏了,而我要發佈一個新的,因爲我覺得選擇的答案有一個小瑕疵。也許它沒有在回答中產生的力矩,但現在在2013,答案應該是這樣的:

# bypass re-entering current password for edit 
    def update_with_password(params={}) 
    current_password = params.delete(:current_password) 

    if params[:password].blank? 
     params.delete(:password) 
     params.delete(:password_confirmation) if params[:password_confirmation].blank? 
    end 
    update_attributes(params) 

    clean_up_passwords 
    end 
+0

但是在RegistrationsController#update方法中會是什麼? – 2013-06-04 17:47:16

+0

沒什麼。根本不應該創建註冊控制器。解決方法是隻在用戶模型中創建,就像我在答案中放置的一樣,而不是像在問題中說的那樣創建任何其他類。 – Aleks 2013-06-05 16:13:35

0

有:

的解決辦法是在User模型這樣創造一個更簡單的答案,我不知道什麼時候色器件先過這種方法,但只需添加

Model.update_without_password(params)

它會更新屬性,而不需要當前密碼。