Rails:开始Rescue块没有被私有方法调用

时间:2014-09-06 12:08:04

标签: ruby-on-rails refactoring

在我的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命令。这是为什么?我做错了什么?

更新:

我明白我做错了什么。但是我该如何以正确的方式做到这一点?

2 个答案:

答案 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