脱离控制器动作

Reb*_*rth 2 ruby ruby-on-rails ruby-on-rails-4

我的问题是是否存在相当于“脱离”控制器动作的导轨,例如

def new
    if some_confirmation
        do_stuff
        break #I know this only breaks out of a loop but I want it to break out of the action. is this possible?
    end
    do_some_other_stuff_which_it_should_not_reach_after_breaking
end
Run Code Online (Sandbox Code Playgroud)

这也提出了一个问题,如果我做错了什么,而不应该用 before_filter

还有最后一个问题,是将所有内容都包含在此类定义中的“if-else”语句中(不一定是控制器操作,也可以是普通定义),还是像我打算在那里做的那样做 ^?

pdo*_*obb 5

答案是使用return. 控制器操作只是方法,return是您从方法中提前返回的方式。这样做并没有错,您应该可以根据需要随意这样做。

正如您所提到的,您可以使用before_filters(before_action在 Rails 4 中已重命名为),但我建议仅在控制器中的每个方法都需要条件时才这样做。否则,您最终会before_action在顶部看到一个巨大的s列表,您在稍后阅读操作时必须牢记(或感到惊讶);如果您必须记住哪些适用,哪些不适用于哪些操作,就会变得特别混乱!

是否更喜欢 if-else 语句是一种意见......但是,受到 Avdi Grimm 的优秀书籍Confident Ruby 的启发,我建议按照你在这里所做的那样做......你所设置的本质上是一个保护子句,您可以提前退出该方法,然后进入该方法的实际内容。在Confident Ruby 中,Avdi Grimm 谈到将方法分解为逻辑部分以讲述一个连贯的故事,而不会强迫读者在方法的整个生命周期中跟踪各种状态。使用 if-else 语句往往会迫使读者跟踪状态,而使用保护子句可以让您快速识别离开方法的条件,然后忘记它们,以便您可以专注于方法的实际目的。