我的问题是,是否存在相当于“打破”控制器动作的轨道,例如
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
这也提出了一个问题,如果我做错了什么,不应该用before_filter
最后一个问题,最好将所有内容都包含在这些定义中的'if-else'语句中(不一定是控制器操作,还包括常规定义),还是像我打算在那里做的那样^?< / p>
答案 0 :(得分:4)
答案是使用return
。控制器操作只是方法,而return
是您从方法中提前返回的方式。这样做并没有错,你可以根据需要自由地做。
如您所述,您可以使用before_filter
(已在Rails 4中重命名为before_action
),但我建议仅在控制器中的每个方法都需要条件时才执行此操作。否则,你最终会在顶部找到一个巨大的before_action
列表,你必须在以后阅读这些行动时记住(或惊讶);如果你必须记住哪些适用哪些以及哪些不适用于哪些行为,那就特别令人困惑!
是否首选if-else语句有点意见......但是,受到Avdi Grimm优秀书籍Confident Ruby的启发,我建议你像在这里做的那样做......你是什么人设置本质上是一个保护条款,你可以提前预先退出方法,然后你进入方法的实际内容。在自信的Ruby 中,Avdi Grimm谈到将方法分解为逻辑部分,以讲述一个连贯的故事,这个故事不会强迫读者在方法的整个生命周期中跟踪各种状态。使用if-else语句会强制读者跟踪状态,而使用guard子句可以让您快速识别离开方法的条件,然后忘记它们,这样您就可以专注于方法的实际目的。