Rails 3 UJS сухой клиент + проверка на стороне сервера - PullRequest
2 голосов
/ 17 октября 2010

Проверка формы с помощью jQuery так же проста, как добавление имени класса в поле. Проверка формы с помощью рельсов так же проста, как введение условия в ваш контроллер (и / или модель).

Я полагаю, что должен быть способ написать валидации один раз и применить их как на стороне клиента, так и на стороне сервера. Я всегда был фанатом написания своего собственного javascript, но с ненавязчивостью rails3 UJS может быть полезным, если он сможет этого добиться.

Спасибо !!

Ответы [ 4 ]

2 голосов
/ 24 ноября 2010
2 голосов
/ 17 октября 2010

Вам следует взглянуть на создание собственного конструктора форм для настройки поведения form_for. Вы можете сделать что-то, что задает для класса имя проверок, определенных для атрибута, и jQuery привязывает себя к соответствующим именам классов. Давайте начнем с того, как может выглядеть конструктор форм.

class ValidationFormBuilder < ActionView::Helpers::FormBuilder
  def text_field(object_name, method, options = {})
    options[:class] = object_name.class.validators_on(method).map do |k| 
      # Eg: ActiveModel::Validations::PresenceValidator -> presence
      k.to_s.slice(/[^:]+Validator$/).chomp('Validator').downcase
    end.join(' ')
    super(object_name, method, options)
  end
end

Вам нужно настроить form_for, чтобы использовать ValidationFormBuilder.

<%= form_for @foo, :builder => ValidationFormBuilder do |f| %>
  <%= f.text_field :bar %>
<% end %>

... becomes something like

<form action="/foo" method="post">
  <input type="text" class="presence" name="foo[bar]" id="foo_bar">
</form>

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

class ValidationFormBuilder < ActionView::Helpers::FormBuilder
  MAPPINGS = {
    ActiveModel::Validations::PresenceValidator => 'text'
  }

  def text_field(object_name, method, options = {})
    options[:class] = object_name.class.validators_on(method).map do |k| 
      MAPPINGS[k]
    end.join(' ')
    super(object_name, method, options)
  end
end

Вы можете увидеть полный список проверок, включенных в Rails, заглянув в activemodel/lib/active_model/validations исходного кода Rails. Надеюсь, этого достаточно, чтобы вы начали.

0 голосов
/ 08 августа 2011

Имеет ли JS валидацию, в том числе некоторые полезные вещи ajax для валидации уникальности.

https://github.com/bcardarella/client_side_validations

http://railscasts.com/episodes/263-client-side-validations

0 голосов
/ 24 ноября 2010

Вы можете использовать проверку на стороне сервера с использованием RJS (и это не зависит от того, используете вы UJS или нет):

# create.js.haml
= render :partial => "shared/flash_messages", :locals => { :flash => flash }

- if @message.errors.any?
  $('#reply_message').html('#{escape_javascript(render(:partial => "message_form"))}');
- else
  $('ul.data_grid .list').append('#{escape_javascript(render "message", :message => @message)}');
  $('#reply_message textarea').val('');
...