正确使用Ruby Proc

时间:2013-11-12 17:56:09

标签: ruby proc

我想知道是否有办法在其他地方的方法顶部定义proc,并且仍然保留proc从方法范围返回的能力。

  def add_user_to_team(user_id, team_id)

    v = Proc.new do |t|
      return t if t.error
      t
    end

    User.transaction do

      user = v.call(
        validate_user_exists(user_id)).obj

      team = v.call(
        validate_team_exists(team_id)).obj

      ...lots of other validations...

      result(true, nil, team_user)
    end

  end

我希望能够在我们可以包含在其他地方的模块中定义此proc。但是,当我有一个方法返回proc时,我得到一个带有return语句的LocalJumpError。

例如,我想做

def validate
  Proc.new do |t|
    return t if t.error
    t
  end
end

并优化原始代码

  def add_user_to_team(user_id, team_id)

    User.transaction do

      user = validate.call(
        validate_user_exists(user_id)).obj

      team = validate.call(
        validate_team_exists(team_id)).obj

      ...lots of other validations...

      result(true, nil, team_user)
    end

  end

我也对如何整合这个错误检查逻辑

的任何其他建议持开放态度
  1. 如果验证失败的范围方法
  2. ,则退出
  3. 如果没有错误则返回对象并继续

1 个答案:

答案 0 :(得分:1)

一种可能性是使用throw / catch提前退出该方法:

module ValidationHelpers
  def check t
    throw :fail, t if t.error
    t
  end
end

并在验证方法中使用它:

def add_user_to_team(user_id, team_id)
  catch(:fail) do
    User.transaction do
      user = check(validate_user_exists(user_id)).obj
      team = check(validate_team_exists(team_id)).obj
      # ...lots of other validations...
      result(true, nil, team_user)
    end
  end
end