Rails显示has_one关系的表

时间:2012-12-30 15:58:59

标签: ruby-on-rails-3

我正试图绕过Rails并且遇到一些困难,试图理解为什么有些人会工作而其他人却没有

例如,有2个表:

班级用户

table users
email:string
password:string

班级简介

table profiles
firstname:string
lastname:string
city:string
user_id:integer

现在每个用户都应该拥有1个个人资料。

所以在模块user.rb我有

has_one :profile

并在profile.rb

belongs_to :user

现在我想做的就是在表中显示两个表

<table>
 <tr>
  <th>User_ID</th>
  <th>Email</th>
  <th>Password digest</th>
  <th>First Name</th>
  <th>Last Name</th>
  <th>City</th>
 </tr>

<% @users.each do |user| %>
 <tr>
  <td><%= user.id %></td>
  <td><%= user.email %></td>
  <td><%= user.password %></td>
  <td><%= user.profile.firstname %></td>%></td>
  <td><%= user.profile.lastname %></td>%></td>
  <td><%= user.profile.city %></td>%></td>
 </tr>
<% end %>
</table>

我有一个带索引页的控制器显示

def index
 #this works
 @users = User.all(:include => :profile)
end

我找到的这段代码很有效,它可以正确地显示表格。

但是我有一个其他代码的列表,我已经通过试图让它工作来收集/拼凑,但是没有用。

因此,这个代码列表将单独放在def索引中以连接两个表

  1. @users = @ users.build_profile() 引发错误:nil的未定义方法`build_profile':NilClass

  2. @users = @ users.profile 引发错误:nil的未定义方法`profile':NilClass

  3. @users = @ user.collect {| user |用户资料 } 引发错误:未定义的方法`collect'代表nil:NilClass

  4. @users = Profile.find(:all) 引发错误:#Profile的未定义方法`email':0x46da5a0

    <% @users.each do |user| %>
    <tr>
    <td><%= user.id %></td>
    <td><%= user.email %></td>
    <td><%= user.password %></td>
    <td><%= user.proflie.firstname %></td>
    
  5. @users = @ profile.create_user() 引发错误:nil的未定义方法`create_user':NilClass

  6. @users = @ users.profiles 引发错误:nil的未定义方法`profiles':NilClass

  7. @users = @ user.each {| user | user.profiles} 引发错误:nil的未定义方法“each”:NilClass

  8. 为什么所有这些其他的都失败了,它们似乎适用于有类似问题的其他用户(连接两个关系为1到0的表)

1 个答案:

答案 0 :(得分:0)

您遇到的大多数问题都是由于您在nil上调用方法这一事实造成的。您需要初始化@users集合,然后才能调用其上的方法。还要确保您在数据库中确实有一些用户。

获取所有用户:

@users = User.all(:include => :profile)
@users = User.includes(:profile) # I prefer this syntax

建立个人资料。请注意,您需要在一个特定User上调用此项,而不是all方法给出的集合:

@profile = @users.first.build_profile # This won't actually save the profile

获取第一个用户的个人资料

@profile = @users.first.profile

获取所有个人资料:

@profiles = @users.collect { |user| user.profile }

获取第一位用户的电子邮件:

@email = @users.first.profile.email

其余部分仅是上述版本的略微修改版本。