如何在我的视图中显示嵌套属性的值?

如何在我的视图中显示嵌套属性的值?

问题描述:

我以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 

你有什么线索?

误差来自哪里使用

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' :)所有用户都将拥有元,但有些领域应该是空的。是否有一个更简洁的方法来检查字段是否为空' – 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

我敢肯定你已经解决了这个问题,但我在这里遇到了同样的问题,并解决了将'nil'方法放在条件内的问题。也许可以帮助有同样问题的人。

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