2011-04-28 107 views
2

在我的更新用戶配置文件表單中,第一個字段要求用戶輸入她當前的密碼。當她提交表格時,我會先驗證密碼,然後再接受其他字段中的更改。下面是我當前如何做這在用戶控制器:要求用戶輸入密碼才能更新配置文件

def update 
    @user = User.find(params[:id]) 
    if @user.has_password?(params[:user][:password]) 
    if @user.update_attributes(params[:user]) 
     flash[:success] = "Profile updated." 
     redirect_to @user 
    else 
     render 'edit' 
    end 
    else 
    flash[:failure] = "Password does not match!" 
    render 'edit' 
    end 
end 

我覺得有一個更好的方式來做到這一點。例如,我可以使密碼匹配用戶模型中的驗證。然後formtastic會自動處理我的錯誤信息(而不是我上面的醜陋閃光方法)。我試着用

validate :password_match?, :on => :update 

而且

def password_match? 
    has_password(params[:user][:password]) 
end 

這樣做,但被懷疑params爲不從模型訪問。

我搜索了20分鐘的方法來做到這一點,找不到任何不涉及設計或Authlogic。我從頭開始進行身份驗證(一切工作正常:登錄,會話等)。

請給我看看更好的方式!

+0

如果你使用[色器件(https://github.com/plataformatec/devise),這將是建立在你的[編輯用戶註冊視圖(https://開頭github上。 com/plataformatec/devise/blob/master/app/views/devise/registrations/edit.html.erb#L15) – Zabba 2011-04-28 18:18:40

+0

下一次我會確定使用devise。我最近學習了Rails,並參與了一個涉及從頭開始構建認證的教程。自那以後,我一直在爲我的項目編寫代碼。 – 2011-04-28 18:22:49

回答

1

您不需要設計,只需在您的控制器上使用before過濾器更新 在您的配置文件控制器上。

before_filter password_match, :only => :update 

然後在底部作爲私人。


private 

def password_match 
    @user = User.find(params[:id]) 
    @user.has_password?(params[:user][:password]) 

+0

這條道路讓我失望了一個兔子洞。將您拖入上下文可能不值得,但我們必須來回多次。我只會堅持我原來的解決方案。我認爲這可能是因爲我不知道如何正確使用errors.add將自定義錯誤添加到密碼字段。無論如何,接受答案,因爲這是一個很好的建議。 – 2011-04-28 22:18:30

+0

去喝杯咖啡,休息一會兒。你不需要errors.add,那麼在屏幕頂部的閃爍錯誤怎麼樣?只需添加一個flash.now [:error] ='密碼與您當前的密碼不匹配'就是這樣:) – daniel 2011-04-29 02:58:18

+0

這實際上是我原來的方法,請參閱上面的第一個代碼示例。我決定堅持下去。 – 2011-05-15 00:37:16

相關問題