0

我看到很多使用 bang 方法的书,例如create!orsave!但他们不使用救援块来捕获异常,例如,如果我从 ruby​​ on rails 教程书中获取一段代码:

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

这里 michael hartl 使用 follow with !, 和 bang 方法创建!没有救援例外,有人可以向我解释什么时候应该使用 bang 方法,是否有必要添加救援?

谢谢你

4

2 回答 2

2

我有一个一般规则:如果我不希望 a createor saveetc 失败,我会使用 bang 版本。如果它从不失败,那没有什么区别,如果它有时由于错误或损坏的数据而失败,那么

  1. 我收到通知(通过空气制动)
  2. 我可以防止数据库损坏(通过事务回滚)。否则,asave可能会在某个时候出乎意料地失败,并且您可能会在几个月后注意到它
于 2013-05-27T16:34:56.790 回答
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

所以在我的拙见中,你不应该在你的控制器中使用 bang 方法。如果你这样做了,请优雅地处理它们,以便用户收到有用的错误消息,说明出了什么问题,如何修复它而不是 Rails 著名的“出错了”错误 500 页。

于 2013-05-27T17:09:51.773 回答