使用jQuery進行表單驗證與將字段名添加到字段一樣簡單。使用Rails進行表單驗證與將條件添加到控制器(和/或模型)一樣簡單。Rails 3 UJS幹客戶端+服務器端表單驗證
我認爲應該有一種方法來寫驗證一次,讓他們應用客戶端和服務器端。我一直都很喜歡編寫自己的javascript,但是使用rails3不顯眼的UJS在這裏可能是非常值得的。
謝謝!
使用jQuery進行表單驗證與將字段名添加到字段一樣簡單。使用Rails進行表單驗證與將條件添加到控制器(和/或模型)一樣簡單。Rails 3 UJS幹客戶端+服務器端表單驗證
我認爲應該有一種方法來寫驗證一次,讓他們應用客戶端和服務器端。我一直都很喜歡編寫自己的javascript,但是使用rails3不顯眼的UJS在這裏可能是非常值得的。
謝謝!
你應該看看如何創建自己的表單構建器來定製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中驗證的完整列表在Rails的源代碼activemodel/lib/active_model/validations
偷看。我希望這足以讓你開始。
可以使用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('');