2013-05-27 2 views
0

я вижу много книг, которые используют метод взрыва, как create! или save!, но они не используют спасательных блок, чтобы поймать исключения, например, если я взять блок кода из рубина на рельсах учебник:использования спасательных с методом взрыва или не

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

здесь michael hartl use follow with! , и метод bang create! без исключения для спасения, кто-то может объяснить мне, когда я должен использовать метод bang, и нужно ли добавлять к нему спасение?

спасибо

ответ

1

Я думаю, вы уже знаете, что методы восклицательным (create! и т.д.) вызовет ошибку, тогда как простые методы (create) не будет. ваш вопрос заключается в том, что следует использовать где. Ну, это сводится к кадровым предпочтениям, где никто не прав. но в целом рельсы база кода (включая код по умолчанию, порожденным рельсам), кажется, следовать этому

простых методов в контроллерах

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 

метода взрывы в тестах

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

так в мое Humble Opinion, вы не должны использовать методы bang в своих контроллерах. Если вы это сделаете, пожалуйста, обработайте их изящно, чтобы пользователь получил полезное сообщение об ошибке, в котором говорится, что пошло не так, как исправить его, а не рельсы известные »Что-то пошло не так« Ошибка 500 страниц.

+0

спасибо, это полезно, но у меня есть только Один вопрос, в производстве, если я использую метод bang без спасения, как блок кода в моем вопросе, рельсы автоматически показывают вам страницу со знаменитым предложением «Somethig пошло не так» или он показывает вам страницу с подробными ошибками для этого исключения? – medBo

+0

@medBo: в процессе разработки вы получаете детали. В производстве: красное сообщение –

2

У меня есть общее правило: если я не ожидаю create или save и т.д., чтобы потерпеть неудачу, я использую версию взрыва. Если это не удается, это не имеет никакого значения, если он однако не может когда-нибудь, из-за ошибки или повреждения данных, а затем

  1. Я получаю уведомление (через тормозные щитки)
  2. можно предотвратить повреждение базы данных (с помощью отката транзакции). В противном случае может произойти сбой save когда-то, неожиданно, и вы заметите, это может быть месяцев спустя
+0

@Sergio thnx для редактирования –

+0

, но вы не ответили на мой вопрос :( – medBo

+0

, если вы ожидаете, что 'save' будет терпеть неудачу, вы можете либо использовать версию bang, либо спасти исключение, либо использовать обычную версию и проверить для true/false, я думаю, что последний является более элегантным, но это вопрос вкуса. Вы должны спросить себя: «Я ожидаю провала, и как я его обрабатываю». Если вы ожидаете этого, вы __have__ обработайте его. –

Смежные вопросы