Ruby on rails Rails 3 UJS干式客户端&x2B;服务器端表单验证
使用jQuery进行表单验证与向字段添加类名一样简单。使用rails进行表单验证与向控制器(和/或模型)添加条件一样简单 我认为应该有一种方法来编写一次验证,并将其应用于客户端和服务器端。我一直热衷于编写自己的javascript,但如果rails3能够做到这一点,那么UJS在这里可能非常值得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自身绑定到相应的类名。让我们从表单生成器的外观开始
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('');