rails 3.2.8验证错误未在视图中显示

时间:2012-11-24 17:25:30

标签: ruby-on-rails validation

无法弄清楚如何在创建或编辑视图中显示验证错误。

在我的模特中,我有:

 class Person < ActiveRecord::Base
   attr_accessible :first_name, :last_name

 belongs_to :organization

   validates_presence_of :first_name,  :message => "First name can't be blank"
   validates_presence_of :last_name,  :message => "Last name can't be blank"

在我的控制器中我有

def update
    @person = Person.find(params[:id])
        if @person.update_attributes(params[:person])
       redirect_to(:action => 'list')
    else
      render('edit')
    end
  end

在我看来,我有

<div>
<%= form_for(:person, :url => {:action => 'update', :id => @person.id}) do |f| %>
<%= f.errors %>

<table>

    <tr>
        <th>First Name:</th>
        <td><%= f.text_field(:first_name) %></td>
    </tr>
    <tr>
        <th>Last Name:</th>
        <td><%= f.text_field(:last_name) %></td>
    </tr>
</table>

    <div>
    <%= submit_tag("Update Person") %>
       </div>
<% end %>
</div>

当我在浏览器中通过将名字字段留空来测试验证时,它不保存记录并重定向到编辑但不显示任何验证错误。但是,当我在控制台中尝试使用:

f = Person.find(1)
#returns record
f.first_name = “”
#returns “”
f.save
#returns false 
f.errors
#returns @message = (:first_name => [“First name can't be blank”])

所以它适用于控制台但不适用于浏览器。我做错了什么?

3 个答案:

答案 0 :(得分:0)

您使用错误的方式显示错误消息。它是<%= f.error_messages %>而不是<%= f.errors %>。看看这个链接  rails_rendering_errors

答案 1 :(得分:0)

在lynda.com和K. Skoglund的帮助下,我想出了如何修复错误。首先,我创建了一个部分来处理错误消息

<% if object && object.errors.size > 0 %>
    <div>
        <h2><%= pluralize(object.errors.size, "error") %> 
        prohibited this record from being saved</h2>
        <p>There were problems with the following fields:</p>
        <ul>
        <% object.errors.full_messages.each do |msg| %>
            <li><%= msg %></li>
        <% end %>
        </ul>
      </div>
     <% end %>

然后我创建了一个帮助方法来调用表单

def error_messages_for (object)
  render(:partial => 'shared/error_messages', 
  :locals => {:object => object})
end

最后,我将帮助器方法添加到我创建的用于编辑和新模板的表单部分的顶部:

<%= error_messages_for(@person) %>
<table>
    <tr>
        <th>First Name:</th>
        <td><%= f.text_field(:first_name) %></td>
    </tr>
    <tr>
        <th>Last Name:</th>
        <td><%= f.text_field(:last_name) %></td>
    </tr>

    </table>

答案 2 :(得分:0)

虽然这不能直接回答您的问题,但我强烈建议您停止使用rails类型的代码来编写“敏捷开发”。熟悉优秀的宝石,例如:

  • decent_exposure
  • simple_form
  • HAML-轨

并停止编写大量的样板代码来做简单的事情。