HAML - 如何创建表单验证和显示错误消息?

时间:2012-04-20 20:06:53

标签: ruby-on-rails 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 个答案:

答案 0 :(得分:2)

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

但您可以另外模型级验证使用客户端验证:即,在发送到服务器之前将检查数据。这样,用户无需提交表单即可发现他忘记填写某些必填字段。但当然这不能保证,因为它很容易绕过。 Here有关客户端验证的更多信息。

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

答案 1 :(得分: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,则会自动获得内联自动验证消息,而您的表单将如下所示:

= 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>')