使用bang方法进行救援

时间:2013-05-27 16:30:55

标签: ruby-on-rails

我看到很多书使用了像create!save!这样的爆炸方法,但他们没有使用 rescue 块来捕获异常,例如,如果我采取阻止来自ruby on rails tutoriel book的代码:

def follow!(other user)
 relationships.create!(followed_id: other_user.id)
end

这里michael hartl使用跟随! ,和爆炸方法创造!没有救援例外,有人可以向我解释我应该使用爆炸方法并且是否有必要为其添加救援?

谢谢

2 个答案:

答案 0 :(得分:2)

我有一个一般规则:如果我不希望createsave等失败,我会使用爆炸版本。如果它永远不会失败,那么它没有任何区别,如果它因某个错误或数据损坏而失败,那么

  1. 我收到通知(通过airbrake)
  2. 我可以防止数据库损坏(通过事务回滚)。否则,save可能会在某个时间意外失败,并且您可能会在几个月后发现它

答案 1 :(得分:1)

我认为你已经知道bang方法(create!等)会引发错误,而普通方法(create)则不会。你的问题应该在哪里使用。嗯,它归结为人员偏好,这是没有正确的方法。但一般来说rails代码库(包括rails生成的默认代码)似乎都遵循这个

控制器中的普通方法

def create
 @post = Post.new
 @post = params[:posts]
 if @post.save 
    #success, redirect_to  new post & set succcess flash 
 else
    #failure, render new action again with errors 
end

测试中的Bang方法

it "creates a new post" do
   p = Post.create! :title => '' #auto raise an error on validation failure             
   p.should do_something
end

所以在我的拙见中,你不应该在你的控制器中使用爆炸方法。如果你这样做,请优雅地处理它们,以便用户得到一条有用的错误消息,说明出了什么问题,如何解决它而不是铁路着名" 出了问题"错误500页。