[英]Rails: Begin Rescue block not being called in private method
在我的rails應用程序中,我的SessionsController
的create
方法中具有以下邏輯,我想通過將其提取到方法中來進行重構:
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
命令處停止。 這是為什么? 我究竟做錯了什么?
更新:
我了解我在做什么錯。 但是,我該如何以正確的方式做到這一點?
return語句只是從調用它的函數即find_user方法返回。
好的,所以我可以使用如下代碼:
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.