在我的rails应用程序中,我在SessionsController
的{{1}}方法中有一些逻辑,我想通过将其提取到方法中来重构:
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
命令。这是为什么?我做错了什么?
更新:
我明白我做错了什么。但是我该如何以正确的方式做到这一点?
答案 0 :(得分:1)
return语句只是从调用它的函数返回,即find_user方法。
答案 1 :(得分: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