Ответ 1
Как правило, вы хотите использовать версии non-bang в своих контроллерах. Это позволяет логику следующим образом:
def update
@model = Model.find params[:id]
if @model.update_attributes params[:model] #returns true of false
# handle success
else
# handle failure
end
end
Я часто использую версии bang в тестах, когда хочу убедиться, что знаю, что что-то не проверяет и не сохраняется. Я определенно потратил время на отладку тестов, которые терпели неудачу из-за измененной проверки модели, что было бы очевидно, если бы я использовал версии bang.
например.
it "should do something" do
m = Model.create! :foo => 'bar' # will raise an error on validation failure
m.should do_something
end
Что касается отсутствия недопустимых данных в базе данных, вы должны обрабатывать это с помощью проверки ActiveRecord (например, validates_presence_of :user_id
) или определять свой собственный метод validate
в модели. (http://api.rubyonrails.org/classes/ActiveRecord/Validations/ClassMethods.html) Это должно предотвратить сохранение, если ваши данные недействительны. Если вы действительно параноик, вы можете добавить некоторые ограничения в свою базу данных. Проверьте документы ActiveRecord::Migration
на то, как настроить уникальные индексы и другие ограничения базы данных в ваших миграциях.
Также, по моему опыту, вы хотите избежать использования каких-либо пользовательских методов сохранения или создания, когда это возможно. Если вы повторно реализуете функциональность, включенную в ActiveRecord, вы в конечном итоге платите цену по дороге. http://matthewpaulmoore.com/post/5190436725/ruby-on-rails-code-quality-checklist имеет больше сказать об этом.