使用简单表格进行验证

时间:2012-12-12 00:48:48

标签: ruby-on-rails ruby-on-rails-3 simple-form

我正在尝试使用simple_form gem来创建表单。我也使用twitter引导程序进行样式化,因此在某些情况下,simple_form过于严格,无法执行我想做的事情(并非总是如此)。

我提交的表单应该在验证时失败,它确实如此。但是,当它再次呈现页面时,它不会在输入附近显示错误消息,并且页面只会呈现一半。

控制器代码 :(注意,我基本上使用show / edit操作同样的事情)

def update
  @contact = current_resource
  authorize! :update, @contact

  respond_to do |format|
    if @contact.update_attributes(params[:customer_relationship_contact])
      format.html { redirect_to customer_relationship_contact_url(@contact), notice: "#{@contact.to_s} was successfully updated." }
      format.json { head :no_content }
    else
      format.html { render :edit }
      format.json { render json: @contact.errors, status: :unprocessable_entity }
    end
  end
end

def show
  @contact = current_resource
  authorize! :show, @contact

  respond_to do |format|
    format.html # show.html.erb
    format.json { render json: @contact }
  end
end

查看/表单代码

<%= simple_form_for @contact, :html => {:novalidate => true} do |f| %>
<%= f.error_notification %>
<fieldset>

  <legend>Contract</legend>
  <div class="controls controls-row">
    <div class="span3">
      <div class="controls controls-row">
        <%= f.label :tax_id_number, 'Social Security No.' %>
        <%= f.text_field :tax_id_number, class: 'span12', placeholder: 'Social Security No.' %>
      </div>
    </div>
  </div>
  </div>
</fieldset>

<div class="form-actions">
  <%= f.button :submit, :class => 'btn-primary' %>
  <%= link_to "Cancel", customer_relationship_contacts_path, :class => 'btn' %>
</div>

模型验证

    validates :tax_id_number, format: { with: /\A[0-9]+\z/, message: "Please enter only numbers without dashes." }, allow_blank: true

1 个答案:

答案 0 :(得分:0)

这里的问题是您在视图中使用f.labelf.text_field - 简单的表单构建简单,因此您需要的是f.input - 所以在这种情况下:

<%= f.input :tax_id_number, label: 'Social Security No.', placeholder: 'Social Security No.' %>

以下是发生的事情 - f.input将使用输入类创建环绕div。在该div中是标签和输入。如果有任何错误,简单表单会将类field_with_errors添加到周围的div中,并在输入后使用类error添加包含消息的范围。如果您不使用f.input

,则不会发生这种情况

剩下的就是用css设置它们的样式。