ValidationResponse

ValidationResponse это библиотека для приведения к единообразной структуре сообщения об ошибках одного или нескольких объектов ActiveRecord

  • Подсветка полей с ошибками в формах

Установка (Installation)

Add this line to your application's Gemfile:

gem 'validate-response', '~> 0.0.5'

And then execute:

$ bundle install

Add this line to your application.js

//= require validate-response

Как использовать (Usage)

(!) nil - Используется для обозначения new_record записей (еще не сохраненных в базе)

Пример использования (Usage example):

Сервер (Server):

room = Room.create(params[:room])
render json: {
  result: room.valid?,
  validates: ValidateResponse.new(room)
}

Клиент (Client):

Код
# dom element containing the highlightable fields
$form = $('.my-form')
$.ajax
  url:      '/'
  type:     'POST'
  dataType: 'json'
  success:  (data) ->
    $(document).trigger ValidateResponse.EVENT_SHOW_ERRORS, [$form, data.validates] if data.validates
DOM
.my-form
  %div
    %label{data: {vr_field: "rooms|#{@room.id}|field1"}} Label 1
    %input{type: 'text', value: @room.field1, name: 'room[field1]'}
  %div
    %label{data: {vr_field: "rooms||field2", vr_way: 'border'}} Label 2
    %input{type: 'text', value: @room.field2, name: 'room[field2]'}

Привила настройки форм (Form settings rules)

data-vr-field:

# @room => Модель Room
# @room.id => 1

vr-field:

vr-field: 'rooms|1|field_name'

#@room => Модель Room
#@room.id => nil

vr-field:

vr-field: 'rooms||field_name'

data-vr-way:

data-vr-way: 'color'
  Вслучае ошибки цвет текста станет красным
'title'
  Вслучае ошибки текст всплывающей подсказки будет содержать сообщение об ошибке
'outline'
  Вслучае ошибки цвет внешней рамки станет красным
'border'
  Вслучае ошибки цвет рамки станет красным
'background'
  Вслучае ошибки цвет фона станет красным

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

Свойства vr-way можно группировать

vr-way: 'color|title'

Другие примеры (More examples):

render json: {
  result: @user.update_attributes(params[:user]),
  validates: ValidateResponse.new(@user.contacts)
}

-- or --

  ValidateResponse.new(
    Room.create,
    User.create,
    User.last.tap{|u| u.email = nil; u.valid?}
  )

вернет (return)

{
    :rooms => {
        nil => {
            :location_id => [
                [0] "не может быть пустым"
            ],
                   :user => [
                [0] "не может быть пустым"
            ],
                  :floor => [
                [0] "не является числом"
            ],
                     :sq => [
                [0] "не является числом"
            ],
              :price_psm => [
                [0] "не является числом"
            ],
             :total_cost => [
                [0] "не является числом"
            ]
        }
    },
    :users => {
        nil => {
               :email => [
                [0] "не может быть пустым"
            ],
            :password => [
                [0] "не может быть пустым"
            ],
             :city_id => [
                [0] "не может быть пустым"
            ],
             :company => [
                [0] "не может быть пустым"
            ]
        },
        242 => {
            :email => [
                [0] "не может быть пустым"
            ]
        }
    }
}

Поддерживаются объекты разных моделей (Supported object of different AR models at the same time)

a.update_attributes(...)
b.update_attributes(...)
ValidateResponse.new(a, b)

Примеры заполнения (Filling examples):

Пример 1 (Example 1):

  ValidateResponse.new(@user.contacts)

Пример 2 (Example 2):

ValidateResponse.new(@room1, @room2)

Пример 3 (Example 3):

x = ValidateResponse.new()
x << contact1
x << contact2
x << contact3 << contact4

Пример 4. Ручное заполнение (Example 4 Manual filling):

x = ValidateResponse.new()
x[:users, 1] = {
  name: 'ошибка такая-то',
  age: ['несоответствие 1', 'несоответствие 2']
}
x[:users, nil] = {
  name: 'ошибка такая-то',
  age: ['несоответствие 1', 'несоответствие 2']
}

Пример 5. Ручное заполнение (Example 5 Manual filling):

x = ValidateResponse.new()
x[:users] = {
  1 => {
    name: 'ошибка такая-то',
    age: ['несоответствие 1', 'несоответствие 2']
  },
  nil => {
    name: 'ошибка такая-то',
    age: ['несоответствие 1', 'несоответствие 2']
  }
}

Пример 6. Ручное заполнение (Example 6 Manual filling):

x = ValidateResponse.new()
x[:users, nil][:name] = ['несоответствие 1', 'несоответствие 2']

Для разработчиков (Contributing)

  1. Fork it
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Commit your changes (git commit -am 'Add some feature')
  4. Push to the branch (git push origin my-new-feature)
  5. Create new Pull Request