jQueryを使用したフォームの検証は、フィールドにクラス名を追加するのと同じくらい簡単です。レールを使用したフォームの検証は、コントローラー(および/またはモデル)に条件を設定するのと同じくらい簡単です。
検証を一度記述して、クライアント側とサーバー側の両方に適用する方法があるはずだと思います。私はいつも自分のJavaScriptを書くのが好きですが、rails3を使用すると、UJSがこれを実現できれば、ここで十分に価値があるかもしれません。
ありがとう!!
jQueryを使用したフォームの検証は、フィールドにクラス名を追加するのと同じくらい簡単です。レールを使用したフォームの検証は、コントローラー(および/またはモデル)に条件を設定するのと同じくらい簡単です。
検証を一度記述して、クライアント側とサーバー側の両方に適用する方法があるはずだと思います。私はいつも自分の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
activemodel/lib/active_model/validations
Railsのソースコードを覗いてみると、Railsに含まれている検証の完全なリストを見ることができます。それで始められるといいのですが。
一意性を検証するためのいくつかのきちんとしたJavaScriptを含むJS検証を行います。
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('');