0

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

在我的模型中,我有:

 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”])

所以它在控制台中有效,但在浏览器中无效。我究竟做错了什么?

4

3 回答 3

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>
于 2012-11-24T21:20:43.953 回答
0

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

  • 体面的曝光
  • 简单的模式
  • 铁轨

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

于 2012-11-25T14:17:22.407 回答
0

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

于 2012-11-24T17:35:35.047 回答