2016-01-30 3 views
3

Рассмотрим фрагмент из 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?

ответ

3

Validations & Coercion раздел в официальном руководстве объясняет, почему у вас должны быть проверки по вашим запросам, а не на ваших моделях.

Чтобы резюмировать, вот две основные причины:

  1. С архитектурной точки зрения, недействительные входы никогда не должно быть позволено ввести систему, так что лучше, чтобы полностью пропустить их на контроллере а не создавать модель только для проверки, поскольку это довольно дорогостоящая операция.

  2. Возможно, имеется несколько запросов, которые работают на одной и той же модели. Если у вас есть проверки на уровне модели, вам также необходимо будет учитывать различные сценарии для этих запросов, которые снова являются ответственностью контроллера, а не моделью.

Тем не менее, если вы можете сделать это, используя приведенные выше сценарии в своей бизнес-логике, все зависит от личных предпочтений.

+0

После публикации этого вопроса я прочитал эту тему более подробно, и ваша точка в 2. действительно является основной причиной сохранения валидаций из объектов. Однако мне все же кажется неправильным, чтобы они приводили их в действие, поскольку это связывает их с механизмом доставки. Я буду благодарен за ваши отзывы [по этому вопросу о последующих действиях] (http://stackoverflow.com/questions/35136512/implementing-form-objects-in-hanami), где я подробно расскажу об этом. – Jonah

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