知道如何进一步重构它

Any idea how I can refactor this any further

我是 rails 的新手,我真的尽了最大努力来重构这个方法,但这是我能做到的最小的方法。关于我可以提取或重构什么的任何想法?等等

def create
 if verify_recaptcha
  super do |resource|
    if resource.save
      pin = resource.create_pin(otp: new_otp)
      begin
        SendMessage.new({pin: pin.otp, contact_number: resource.contact_number, first_name: resource.first_name}).send_otp
      rescue Exceptions::ServiceDownError
        sign_in(resource)
        return redirect_to users_otp_verification_path(user: @user.uuid, service_status: true)
      end
      sign_in(resource)
      return redirect_to users_otp_verification_path(user: @user.uuid)
    else
      return render :new, resource: resource
    end
  end
  else
     flash.now[:alert] = 'There was an error with the recaptcha verification. Please verify that you are human.'
     flash.delete :recaptcha_error
     return render :new, resource: build_resource(hash = nil)
  end
end

开始你可以做:

def create
  if verify_recaptcha
    super do |resource|
      return render :new, resource: resource unless resource.save
      begin
        SendMessage.new({pin: resource.create_pin(otp: new_otp).otp, contact_number: resource.contact_number, first_name: resource.first_name}).send_otp
      rescue Exceptions::ServiceDownError
        sign_in(resource)
        return redirect_to users_otp_verification_path(user: @user.uuid, service_status: true)
      end
      sign_in(resource)
      return redirect_to users_otp_verification_path(user: @user.uuid)
    end
  else
    flash.now[:alert] = 'There was an error with the recaptcha verification. Please verify that you are human.'
    flash.delete :recaptcha_error
    return render :new, resource: build_resource(hash = nil)
  end
end

我不知道 'service_status: true' 在 ServiceDownError 中意味着什么...但我想你可以这样做:

def create
  if verify_recaptcha
    super do |resource|
      return render :new, resource: resource unless resource.save
      begin
        SendMessage.new({pin: resource.create_pin(otp: new_otp).otp, contact_number: resource.contact_number, first_name: resource.first_name}).send_otp
      ensure
        sign_in(resource)
        return redirect_to users_otp_verification_path(user: @user.uuid, service_status: true)
      end
    end
  else
    flash.now[:alert] = 'There was an error with the recaptcha verification. Please verify that you are human.'
    flash.delete :recaptcha_error
    return render :new, resource: build_resource(hash = nil)
  end
end

或者也许:

def create
  if verify_recaptcha
    super do |resource|
      return render :new, resource: resource unless resource.save
      status = nil
      begin
        SendMessage.new({pin: resource.create_pin(otp: new_otp).otp, contact_number: resource.contact_number, first_name: resource.first_name}).send_otp
      rescue Exceptions::ServiceDownError
        status = true
      ensure
        sign_in(resource)
        return redirect_to users_otp_verification_path(user: @user.uuid, status: status)
      end
    end
  else
    flash.now[:alert] = 'There was an error with the recaptcha verification. Please verify that you are human.'
    flash.delete :recaptcha_error
    return render :new, resource: build_resource(hash = nil)
  end
end

要更进一步,您可以使用单独的方法提取它:

{pin: resource.create_pin(otp: new_otp).otp, contact_number: resource.contact_number, first_name: resource.first_name}

喜欢:

private

def message_params(resource)
  {
    pin: resource.create_pin(otp: new_otp).otp,
    contact_number: resource.contact_number,
    first_name: resource.first_name
  }
end

请记住,重构不仅仅是让代码变小,还要让它更简洁、更易于阅读,因此将内容提取到更小的方法中可能是个好主意