-4

在我的控制器中,很多嵌套的 if

@cat = params[:categ]
@gid = get_uid(params[:url])
if @gid
    @data = get_task_info(@gid,@cat)
        if @data
        task = Task.new_task(@cat, @data, params[:qty], current_user.id)
            if task.uniq?
                if current_user.pay_for_task(task)
                task.save
                else
                @error = 3 
                end
            else
            @error = 4 
            end
        else
        @error = 2 
        end
else
    @error = 1
end

建议我如何编写这段代码更正确?

4

2 回答 2

1

好吧,您至少可以正确缩进您的 Ruby 代码。在这里提问时请尽量谦虚一点——我们不是你的仆人。

这可能会对您有所帮助。它不是最有效的,但错误处理并不是真正需要最佳性能的地方!

class LibraryError < RuntimeError; end

begin

  @cat = params[:categ]
  @gid = get_uid(params[:url])
  raise LibraryError, 1 unless @gid

  @data = get_task_info(@gid, @cat)
  raise LibraryError, 2 unless @data

  task = Task.new_task(@cat, @data, params[:qty], current_user.id)
  raise LibraryError, 4 unless task.uniq?

  paid = current_user.pay_for_task(task)
  raise LibraryError, 3 unless paid

  task.save

rescue LibraryError => err

  @error = err.message.to_i

end

但是,如果错误消息是信息字符串而不是数字,那就更好了。(尽管看起来这些数字被存储为字符串,这就是为什么我to_i在分配给时必须写的原因@error。)

于 2013-07-28T13:12:14.737 回答
0

我是这样实现的:

def create
@cat = params[:categ]
@gid = get_uid(params[:url])
return @error=1 unless @gid
@data = get_task_info(@gid,@cat)
return @error=2 unless @data
task = Task.new_task(@cat, @data, params[:qty],current_user.id)
return @error=4 unless task.uniq?
return @error=3 unless current_user.pay_for_task(task)
task.save
end

谢谢大家的帮助

于 2013-07-28T22:42:58.787 回答