2012-04-20 11 views
2

私はHAMLでフォームをレンダリングできますが、どのように検証するかはわかりません。ここでHAML - フォーム検証の作成とエラーメッセージの表示方法

は、私がこれまで持っているものです。

#disclosure-form-container 
    = form_for([:mobile,@disclosure], :html => {:id => "disclosure-form", :remote => true}) do |f| 
     %p 
     =f.label :display_as, (t :select_disclosure_type) 
     =f.select :display_as, options_from_collection_for_select(Disclosure.basics, :display_as, :name, f.object.display_as) 
     %p 
     =f.label :notes, (t :notes) 
     =f.text_area :notes, :class => "#{validation_rules(:free_disclosure_notes)}", :rows => 5 , :id => "disclosure_notes_entry" 
     = buttonset({:submit_label => (t "buttons.influencers.disclosures.create"),:submit_css_class => "call-to-action",:cancel_url => "#",:direction => :left_to_right}) 

これには二つのフィールドと[送信]をクリックし、ボタンでフォームをレンダリングします。しかし、人々があまり多くをせずに提出を入力すればどうなりますか?検証コードはどこに置くのですか。このフォームの検証方法を教えてください。

ありがとうございます!

答えて

2

ユーザーは、モデルに保存してDBに保存する必要があるデータを入力します。モデルレベルで検証を実装するのは当然です。 Railsではモデルの検証を簡単に作成できます。 Hereあなたはそれについて読むことができます。いくつかの言葉で言えば、モデルに数行を追加すると、不一致のデータで保存することができなくなります。

さらに、モデルレベルの検証でクライアント側の検証を使用すると、サーバーに送信する前にデータがチェックされます。このようにして、ユーザーはフォームを送信しなくても、必要なフィールドを入力するのを忘れていることがわかりました。もちろん、バイパスが簡単なので、これは保証ではありません。 Hereクライアント側の検証の詳細。

ご存じのように、Hamlは検証でお手伝いできません。これは素晴らしいツールですが、この目的のためではありません。あなたのDisclosureモデルで

+0

おかげで、しかし何これについて"= {" valid_rules(:free_disclosure_notes)} "、:rows => 5、:id =>" disclosure_notes_entry "....それは検証しようとしているようだが、いいえ? – GeekedOut

+0

少なくとも、いくつかのjs検証があるかもしれませんか? – GeekedOut

+1

私が言ったように、クライアント側の検証は、ユーザーの経験をより良くします。無効なデータの送信を防ぐことはできません。実際の検証はモデルレイヤーで実行されます。コントローラーのアクションで 'Disclosure'といって、' save'が成功したらチェックを保存します。それが大丈夫なら、ユーザーをある挨拶ページにリダイレクトすることができます。そうでない場合(検証に失敗した場合)、フォームを再度表示して、ユーザーにフォームをさらに入力するよう依頼することができます。しかし、再び、それはハム*とは関係ありません! – jdoe

2

、次のものが必要です。

class Disclosure < ActiveRecord::Base 
    validates_presence_of :display_as, :notes 
    ... 
end 

次に、あなたのようなものを使用して、フォームの上部にエラーメッセージを含めることができます。

- if @disclosure.errors.any? 
    %ul.errors 
    - @disclosure.errors.full_messages.each do |msg| 
     %li= msg 

それともSimple Formを使用する場合は、自動取得検証メッセージはインラインで、フォームは次のようになります:

= simple_form_for @disclosure do |f| 
    = f.input :display_as 
    = f.input :notes 
    = f.submit 

あなたは完了です。

JDoeが指摘しているように、HAMLはバリデーションを検出することとは何の関係もなく、サーバが指示するものだけを表示することに注意してください。サーバーは、検証エラーがあるかどうかを判断するものです。

あなたがしようとすると、あなたのフォームにIDを与えると(CoffeeScriptの中で)このような何かを行うことができ、このクライアント側のようなものの同等を思い付くしたい場合:

jQuery -> 
    $('form#disclosures').submit (event) -> 
    unless $('input#display_as').val().length > 0 && $('input#notes').val().length > 0 
     event.preventDefault() 
     $(this).append('<div class="error">You must select 'display' and enter notes.</div>')