新手问题 如何将服务端验证时的错误信息显示到表单页面对应的数据项后面?

diguage · 2013年11月19日 · 最后由 diguage 回复于 2013年11月19日 · 3813 次阅读

问题

遇到一个问题:

假如服务端验证(验证写在 Model 里)时,验证没有通过,如何将错误信息 显示在表单出错数据项的后面

具体表单代码:

<%= form_for(resource, :as => resource_name, :url => session_path(resource_name), html: {role:'form'}) do |f| %>
  <%= f.text_field :email, :required => true, :autofocus => true, class: 'form-control', placeholder: '邮箱' %>
  <small><%= resource.errors[:email].join('') %></small>
  <%= f.password_field :password, :required => true, class: 'form-control', placeholder: '密码'  %>
  <small><%= resource.errors[:password].join('') %></small>
  <%= f.submit "登录", class: 'btn btn-md btn-primary btn-block' %>
<% end %>

根据@Rei的提示,我发现错误信息是放在了resource.errors中。然后,我想使用<small><%= resource.errors[:email].join('') %></small>把和 email 相关的错误信息提取出来。但是,上述表单中, 除了我自己输出的错误外,还会在生成的<input>标签后面,再加上一个<label>错误信息</label>

问题列表:

  1. 为什么会在<input>之后,再次 显示错误信息
  2. 如何最好地取到和某个输入项相关的错误信息,比如,<%= resource.errors[:email].join('') %>这样能否可以?(主要是想定制表单错误提示的显示位置)

山路十八弯

上网查了一些资料,也看了 Rails 的文档。但是,没有一个靠谱的说明。希望了解的朋友能指点一下。

环境说明

  • Rails 3.2.14
  • 原生 Form
  • Bootstrap3--这个可能用不上。呵呵

修改 view 的 from_for 啊。加入自定义大 custom validation block

#1 楼 @cxh116 我的意思是,如果有 A、B、C 三个数据项,这三个数据项分别有一个对应错误。请问,如何将这几个错误分别显示在这三个数据项后面?我试了试一种方式,貌似还可以。但是不知道是否是最好到:

<%= f.text_field :email, :required => true, class: 'form-control', placeholder: '邮箱'  %>
<strong><%= resource.errors[:email].inspect if !resource.errors[:email].nil? %></strong>

<%= f.password_field :password, :required => true, class: 'form-control', placeholder: '密码', maxlength: 16  %>
<strong><%= resource.errors[:password].inspect if !resource.errors[:password].nil? %></strong>

#2 楼 @galaxy_watcher 这个好高端啊。怎么搞啊?

ActiceRecord 的实例有一个 errors 方法,返回一个类似 hash 的东西,可以从里面取错误信息。

#3 楼 @diguage 你加上这段代码,自己再看一下终端的打印输出和页面。之后就自己写逻辑判断

config.action_view.field_error_proc = Proc.new do |html_tag, instance|
  puts instance
  field_name = instance.instance_variable_get('@method_name')
  puts field_name
  puts instance.object
  err_msg = instance.object.errors[field_name]
  puts err_msg
  %Q(<div class="has-error">#{html_tag}</div>#{err_msg}).html_safe
end

#5 楼 @Rei 谢谢!我 Degug 之后,确实是这么回事。

#6 楼 @cxh116 这个方法貌似可以,回头试试。谢谢啊!

需要 登录 后方可回复, 如果你还没有账号请 注册新账号