簡體   English   中英

Rails:未在私有方法中調用Begin Rescue塊

[英]Rails: Begin Rescue block not being called in private method

在我的rails應用程序中,我的SessionsControllercreate方法中具有以下邏輯,我想通過將其提取到方法中來進行重構:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM