2014-09-06 109 views
0

在我的Rails應用程序,我有我的SessionsControllercreate方法該位的邏輯,我想通過提取成一個方法重構出:的Rails:展開救援塊不被稱爲私有方法

if login_form.validate(params[:user]) 
    begin 
    @user = User.find_by!(email: params[:user][:email]) 
    rescue ActiveRecord::RecordNotFound => e 
    flash.now.alert = 'invalid user credentials' 
    render :new and return 
    end 
else 
    flash.now.alert = login_form.errors.full_messages 
    render :new and return 
end 

所有這些都是檢查用戶是否存在於系統中。我想重構爲

if login_form.validate(params[:user]) 
    find_user 
else 
    flash.now.alert = login_form.errors.full_messages 
    render :new and return 
end 

這一點,那麼私人find_user方法:

private 
    def find_user 
    begin 
     @user = User.find_by!(email: params[:user][:email]) 
    rescue ActiveRecord::RecordNotFound => e 
     flash.now.alert = 'invalid user credentials' 
     render :new and return 
    end 
    end 

但現在我做到這一點之後,ActiveRecord::RecordNotFound異常被忽略!該方法不會在return命令處停止。這是爲什麼?我究竟做錯了什麼?

更新:

我明白我在做什麼錯了。但是,我如何以正確的方式做到這一點?

回答

1

return語句只是從調用它的函數返回,即find_user方法。

+0

那麼,什麼是這樣做的正確方法? – 2014-09-06 12:33:46

+1

登錄表單的驗證功能沒有檢查密碼/用戶嗎?我可能會把那個檢查放在那裏,然後你可以跳過異常處理,你不需要find_user方法。 – Robban 2014-09-06 14:34:03

0

好了,所以我可以使用塊,像這樣:

if login_form.validate(params[:user]) 
     find_user do 
     flash.now.alert = 'invalid user credentials' 
     render :new and return 
     end 
    else 
     flash.now.alert = login_form.errors.full_messages 
     render :new and return 
    end 

然後重構像這樣的私有方法:

def find_user(&block) 
    begin 
     @user = User.find_by!(email: params[:user][:email]) 
    rescue ActiveRecord::RecordNotFound => e 
     yield 
    end 
    end 
+0

我不會像這樣發送塊給find_user消息,與您的原始代碼相比,此代碼不會增加可讀性。 – Robban 2014-09-06 14:49:25