Оставаться RESTful при выполнении проверок на стороне сервера AJAX? - PullRequest
1 голос
/ 14 сентября 2010

Приложение My Rails имеет несколько форм. Когда Джо использует мое приложение, я хочу, чтобы каждая форма предоставляла ему немедленную визуальную обратную связь относительно достоверности его ввода для каждого поля. Одно поле проверяет формат его адреса электронной почты - довольно просто. Но другой позволяет ему связать текущий ресурс с рядом других ресурсов, и применяются сложные бизнес-правила. Если форма неполная или недействительная, я хочу запретить Джо двигаться вперед, например, отключив кнопку «отправить».

Я мог бы продублировать проверки, которые появляются в моем коде Rails, написав JavaScript, который также выполняет проверку в браузере. Но это плохо пахнет - каждый раз, когда меняются бизнес-правила, мне нужно обновить их в двух местах с двумя разными языками и двумя наборами тестов.

Или я мог бы добавить один метод к контроллеру для ресурса, называемого 'validate'. Он будет принимать данные формы в запросе AJAX и возвращать ответ, который затем может быть использован внутри формы Джо для предоставления обратной связи проверки в реальном времени. В отличие от действия «создать», действие «проверить» не изменит состояние сервера. Единственная цель «проверки» - предоставить ответ проверки.

Дилемма в том, что мне не нравится добавлять действия в контроллеры RESTful в Rails. Но мне еще меньше нравится идея дублирования кода проверки в двух разных контекстах.

Я заметил этот ТАК вопрос , который затрагивает эту тему. Но меня не интересует плагин или технология. И при этом я не считаю этот вопрос обязательно Rails-специфичным. Меня больше интересует, как лучше всего решать подобные проблемы в веб-приложении.

Я также замечаю этот вопрос SO , который не включает в себя ограничение поддержки архитектуры RESTful.

Учитывая необходимость динамической проверки данных формы со сложными бизнес-правилами в веб-приложении и желательность поддержания REST-подобной серверной архитектуры, каков самый чистый и наиболее поддерживаемый способ выполнения обоих одновременно?

Ответы [ 3 ]

2 голосов
/ 14 сентября 2010

Я не вижу проблем в создании «ресурса обработки» валидатора, который может принять сущность и гарантировать, что она проходит все правила валидации.

Вы можете сделать это либо с помощью глобального валидатора

POST /validator

, когда валидатор должен будет идентифицировать переданное представление и выполнить соответствующие правила, или вы можете создать подресурсы,

POST/foo/validator

До тех пор, пока эти URL-адреса обнаруживаются с помощью гипермедиа, и полное представление для проверки являетсяЯ не вижу, чтобы ограничения REST были нарушены.

1 голос
/ 14 сентября 2010

Надеюсь, я правильно понял, но вы могли бы отправить запросы javascript к тому же действию создания. Например:

def create

  @data = DataObject.new(params[:data])

 if request.xhr?
    response = @data.valid? ? { :success =>  true } : { :errors => @data.errors }
    render :json => response
    return
  end

  # @data.save etc..

end

На самом деле я использую нечто подобное в многошаговом мастере (одностраничная форма со скрытыми секциями CSS).

0 голосов
/ 14 сентября 2010

Вы вправе не дублировать логику проверки на клиенте (javascript) и на стороне сервера).Но добавление ресурсов проверки также увеличивает затраты на обслуживание и затраты на сетевые вызовы сервера.Мне нравится проводить базовую проверку на стороне клиента (лучший пользовательский опыт), а также для согласованности данных на стороне сервера.

Почему бы вам не присоединить вашу модель с метаданными проверки, а затем сгенерировать формы + JavaScript для проверки.При окончательной отправке вы также делаете окончательную проверку на стороне сервера на основе модели.

Я уверен, что некоторая общая логика проверки возможна с Ruby.Я предполагаю также, что некоторые существующие рамки валидации могут быть использованы повторно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...