2012-11-24 34 views
0

無法弄清楚如何獲取驗證錯誤以在創建或編輯視圖中顯示。rails 3.2.8驗證錯誤未顯示在視圖中

在我的模型,我有:

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

所以它在控制檯中工作,但不是瀏覽器。我究竟做錯了什麼?

+1

我認爲顯示錯誤的方法是'<%= f.error_messages%>'或'<%@ post.errors.full_messages.each do | msg | %>

  • <%= msg %>
  • <% end %>' –

    +0

    感謝您的回覆,但當我使用f.error_messages和「未定義方法錯誤」爲零時,我得到了「」 :NilClass「當我使用第二種方式。 – Ria

    +0

    如果你交易'@ person'而不是':person' –

    回答

    0

    您正在使用錯誤的方式顯示錯誤消息。它是<%= f.error_messages %>而不是<%= f.errors %>。看看這個鏈接 rails_rendering_errors

    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> 
    
    0

    儘管這並不直接回答你的問題,我強烈建議停止寫作類型的代碼「與軌道敏捷開發」。熟悉外觀極好的寶石,如:

    • decent_exposure
    • simple_form
    • HAML護欄

    ,並停止寫作噸的樣板代碼做簡單的事情。