2013-03-06 68 views
1

我以Ruby開始,並且在我的視圖中顯示信息時遇到了一些問題。如何在我的視圖中顯示嵌套屬性的值?

這裏是我的代碼: ê 應用程序/模型/ user.rb

class User < ActiveRecord::Base 

    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable 

    # Setup accessible (or protected) attributes for your model 
    attr_accessible :email, :password, :password_confirmation, :remember_me, :encrypted_password, :meta_attributes 

    has_one :meta 
    accepts_nested_attributes_for :meta 
end 

*應用程序/控制器/ users_controllers.rb *

def index 
    @users = User.all 

    respond_to do |format| 
     format.html # index.html.erb 
     format.json { render json: @users } 
    end 
    end 

應用程序/視圖/用戶/index.html.rb

<% @users.each do |user| %> 
     <td><%= user.email %></td> 
     <td><%= user.meta.last_name %></td> 
    <tr> 
     <td><%= link_to 'Show', user %></td> 
     <td><%= link_to 'Edit', edit_user_path(user) %></td> 
     <td><%= link_to 'Destroy', user, method: :delete, data: { confirm: 'Are you sure?' } %></td> 
    </tr> 
    <% end %> 

有你所料,它會返回一些錯誤:

undefined method `last_name' for nil:NilClass 

你有什麼線索?

回答

1

誤差來自哪裏使用

user.meta.last_name 

這意味着user.metanil行。

如果你確信你添加meta給每個用戶在建立它們,問題可能來自一個事實,即meta是不是在你的attr_accessible列表。

如果你並不總是爲每個用戶創建一個meta,你不介意有一個空meta可以回調添加到您的User型號:

before_create :add_meta 

def add_meta 
    if self.meta.nil? 
     self.meta = Meta.create(put_your_default_attributes_here) 
    end 
end 
+0

'meta'是我的'attr_accessible list' :)所有用戶都將擁有元,但有些領域應該是空的。是否有一個更簡潔的方法來檢查字段是否爲空<'%if user.meta%>' – Xavier 2013-03-06 13:34:14

+0

@ x4vier您必須檢查每個字段,例如您的last_name錯誤,您可以用'user替換它。 meta.last_name if!user.meta.nil?'或類似的東西 – alestanis 2013-03-06 15:46:08

+0

@ x4vier如果所有用戶都有一個非零元,你不應該有錯誤,你發佈 – alestanis 2013-03-06 15:47:11

0

我敢肯定你已經解決了這個問題,但我在這裏遇到了同樣的問題,並解決了將'nil'方法放在條件內的問題。也許可以幫助有同樣問題的人。

<td> 
    <% if user.meta %> 
    <%= user.meta.last_name %> 
    <% end %> 
</td>