2

我能够在 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})

这会呈现一个包含两个字段和一个单击提交按钮的表单。但是如果人们只是输入提交而没有做太多事情呢?我在哪里放置验证码以及如何验证此表单?

谢谢!

4

2 回答 2

2

用户输入应保存在模型中然后存储在数据库中的数据。所以很自然地在模型级别实现验证。Rails 允许您轻松地为模型创建验证。在这里你可以阅读它。简而言之:在您的模型中添加几行可以防止它与不一致的数据一起保存。

但是除了模型级验证之外,您还可以使用客户端验证:即,数据将在发送到服务器之前进行检查。这样用户就不必提交表单来发现他忘记填写一些必填字段。但这当然不能作为任何保证,因为它很容易绕过。这里有更多关于客户端验证的信息。

因此,如您所见,Haml 无法帮助您进行验证。这是一个很棒的工具,但不是为了这个目的。

于 2012-04-20T20:21:45.950 回答
2

在您的Disclosure模型中,您需要:

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_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>')
于 2012-04-20T23:22:32.197 回答