Рассмотрим фрагмент из the "Getting Started" guide:Выбор места для размещения валидации?
module Web::Controllers::Books
class Create
include Web::Action
expose :book
params do
param :book do
param :title, presence: true
param :author, presence: true
end
end
def call(params)
if params.valid?
@book = BookRepository.create(Book.new(params[:book]))
redirect_to '/books'
end
end
end
end
Обратите внимание, что валидация на title
и author
, которые живут здесь, в действии контроллера. Мой вопрос: почему эти валидации в параметрах действия, а не на объекте Book
? То есть, предполагая, что валидации были на Book
, вы могли бы написать что-то вроде:
def call(params)
book = Book.new(params)
if book.valid?
@book = BookRepository.create(Book.new(params[:book]))
redirect_to '/books'
end
end
и просто избавиться от params
блока в целом. Это кажется более естественным для меня и будет способствовать более простому повторному использованию валидаций в разных действиях.
Есть ли преимущества для метода params
, который я не вижу? Существуют ли недостатки для размещения проверок на объекте Book
?
После публикации этого вопроса я прочитал эту тему более подробно, и ваша точка в 2. действительно является основной причиной сохранения валидаций из объектов. Однако мне все же кажется неправильным, чтобы они приводили их в действие, поскольку это связывает их с механизмом доставки. Я буду благодарен за ваши отзывы [по этому вопросу о последующих действиях] (http://stackoverflow.com/questions/35136512/implementing-form-objects-in-hanami), где я подробно расскажу об этом. – Jonah