我想知道是否有办法在其他地方的方法顶部定义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
我也对如何整合这个错误检查逻辑
的任何其他建议持开放态度答案 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