2012-12-30 84 views
0

我想換我的頭周圍Rails和已經進入一些困難,試圖理解爲什麼有些事情的工作和別人不一樣的Rails顯示的HAS_ONE關係表

例如,具有2個表:

類用戶

table users 
email:string 
password:string 

類資料

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

現在è ach用戶應該有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() 拋出錯誤:未定義的方法`build_profile」的零:NilClass

  2. @users = @ users.profile 拋出錯誤:零未定義的方法`輪廓」:NilClass

  3. @users = @ user.collect {|用戶| user.profile} 拋出錯誤:未定義的方法`收集 '的零:NilClass

  4. @users = Profile.find(:所有) 拋出錯誤:未定義的方法`電子郵件' 的#Profile: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() 拋出錯誤:未定義的方法`create_user」的零:NilClass

  6. @users = @ users.profiles 拋出錯誤:未定義的方法`型材的零: NilClass

  7. @users = @ user.each {| user |用戶。型材} 拋出錯誤:每個」的零未定義的方法`:NilClass

爲什麼所有這些其他的失敗,他們似乎對於有類似的問題(連接兩個表1到其他用戶的工作零關係)

回答

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 

其餘的只是上面的一個稍微修改過的版本。