Ruby on rails Rails 3 UJS干式客户端&x2B;服务器端表单验证

Ruby on rails Rails 3 UJS干式客户端&x2B;服务器端表单验证,ruby-on-rails,validation,forms,ruby-on-rails-3,ujs,Ruby On Rails,Validation,Forms,Ruby On Rails 3,Ujs,使用jQuery进行表单验证与向字段添加类名一样简单。使用rails进行表单验证与向控制器(和/或模型)添加条件一样简单 我认为应该有一种方法来编写一次验证,并将其应用于客户端和服务器端。我一直热衷于编写自己的javascript,但如果rails3能够做到这一点,那么UJS在这里可能非常值得 谢谢 您应该考虑创建自己的表单生成器,以便为自定义表单的行为。您可以将类设置为属性上定义的验证的名称,并将jQuery自身绑定到相应的类名。让我们从表单生成器的外观开始 class ValidationF

使用jQuery进行表单验证与向字段添加类名一样简单。使用rails进行表单验证与向控制器(和/或模型)添加条件一样简单

我认为应该有一种方法来编写一次验证,并将其应用于客户端和服务器端。我一直热衷于编写自己的javascript,但如果rails3能够做到这一点,那么UJS在这里可能非常值得


谢谢

您应该考虑创建自己的表单生成器,以便为自定义
表单的行为。您可以将类设置为属性上定义的验证的名称,并将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
如果您需要在类名上有更多的灵活性,您可能需要创建一个映射到所需字符串的哈希

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
类验证FormBuilder“文本” } def text_字段(对象名称、方法、选项={}) options[:class]=对象名称.class.validators_on(方法).map do|k| 映射[k] 结束。连接(“”) 超级(对象名称、方法、选项) 结束 结束

通过查看Rails源代码的
activemodel/lib/active\u model/validations
,可以看到Rails中包含的验证的完整列表。我希望这就足够让您开始了。

您可以使用RJS进行服务器端验证(这并不取决于您是否使用UJS):


进行JS验证,包括一些用于验证唯一性的简洁的ajax

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
# 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('');