2012-01-17 194 views
0

我正在嘗試創建User - Infos關聯,其中我的用戶has_many信息。Ruby on Rails - 獲取關聯數據

我試圖從用戶的索引表單上調用我的用戶信息。

通過對我的index.html.erb調用<%= user.infos %>(用戶)返回我從相關信息表中所有提交的數據是這樣的:

[#<Info id: 2, name: "Thales Miguel", date: "1989-07-14", area: "An\xC3\xA1lise de Sistemas", comment: "Analista j\xC3\xBAnior de sistemas.", user_id: 1, created_at: "2012-01-16 15:54:29", updated_at: "2012-01-16 15:54:29">] 

我認爲這樣做<%= user.infos.comment %>它會返回我的「註釋」從用戶,但我得到的是這樣的錯誤:

undefined method `comment' for #<ActiveRecord::Relation:0x3b8ebe8> 

我在做什麼錯?

infos_controller:

class InfosController < ApplicationController 

    def create 
    @user = User.find(params[:user_id]) 
    @info = @user.infos.create(params[:info]) 
    redirect_to user_path(@user) 
    end 

    def destroy 
    @user = User.find(params[:user_id]) 
    @info = @user.infos.find(params[:id]) 
    @info.destroy 
    redirect_to user_path(@user) 
    end 

    def new 
    @user = User.new 
    @user.build_info  
end 

end 

信息模型:

class Info < ActiveRecord::Base 
    belongs_to :user 
end 

用戶模型:

class User < ActiveRecord::Base 
    validates :login, :presence => true 
    validates :password, :presence => true, 
         :length => {:minimum => 5} 

    has_many :infos, :dependent => :destroy 

end 

回答

2

此:

[#<Info id: 2, name: "Thales Miguel", date: "1989-07-14", area: "An\xC3\xA1lise de Sistemas", comment: "Analista j\xC3\xBAnior de sistemas.", user_id: 1, created_at: "2012-01-16 15:54:29", updated_at: "2012-01-16 15:54:29">] 

是一個數組。您必須選擇其中一個對象。如果不選擇其中一個對象,則不能調用屬性值。好的,在這種情況下,只有一個對象,但這並不重要。

+0

而且我怎麼了? – ThalesMiguel 2012-01-17 19:29:19

+0

好吧,如果你知道只有一個(在這種情況下是true),請調用'user.infos.first',或'user.infos.last'或'user.infos [0]'。不管從數組中抽出一個對象,最重要的是什麼。 Google「ruby array」在數組類中查找ruby文檔。 – Matt 2012-01-17 19:30:55

+0

這看起來不像「平常」... 什麼是做我想做的最好的方式? 我如何把它放在對象中? 你真的是在幫我。謝謝! – ThalesMiguel 2012-01-17 19:36:24

1

你應該做的是這樣的:

<% user.infos.each do |info| %> 
    <%= info.comment %> 
<% end %> 

由於davidb說,<% user.infos %>返回數組。 .comment的對象應該是一個實例。

+0

這確實有效。 問題是,通過這樣做,我強迫用戶擁有相關信息。 有沒有辦法強制它? – ThalesMiguel 2012-01-17 19:54:20

+0

嘗試用'<%包裝上面的代碼,除非user.infos.nil? %>'和'<% end %>'。 – Marco 2012-01-17 20:00:33

+0

我試過「除非user.infos.nil?」並沒有奏效。 我的代碼現在是: <%@ users.each do | user | %> \t <%除非user.infos.nil? %> \t \t <%user.infos.each do | info | %> \t \t \t \t​​<%= user.login%> \t \t​​<%= user.password的%> \t \t​​<%= info.name.force_encoding( 「UTF-8」 )%> \t \t​​<%=的link_to '屬性詳細',用戶%> \t \t​​<%=的link_to 'Editar',edit_user_path(用戶)%> \t \t​​<%=的link_to 'Excluir',用戶,確認: 'TEM certeza?',方法:刪除%> \t \t \t \t <% end %> \t <% end %> <% end %> – ThalesMiguel 2012-01-18 11:43:15

1

問題是

info is a relationship link

,如果你想顯示的第一個例如

user.infos[0].comment 

user.infos.first.comment 

如果用戶返回的信息記錄數組,沒有相關信息,則返回零

2

因此,收集所有信息上面寫的是什麼:

你不能叫user.infos.comment,因爲user.infos返回值是Rails的3.2的ActiveRecord::Relation和Rails的3.1及以下的數組。 ActiveRecord :: Relation和array都不知道它應該如何處理comment方法,因爲它們不知道包含的對象的任何內容。

您有多種解決方案可以解決此問題。

如果用戶僅限於只有一個信息:

class User < ActiveRecord::Base 
    has_one :info, :dependent => :destroy 
end 

<%= user.info.comment %> 

如果用戶可以有多個信息對象:

<%- user.infos.each do |info| %> 
<%= info.comment %> 
<% end -%> 

或者

<ul><li> 
<%= user.infos.collect(&:comment).join('</li><li>').html_safe %> 
</li></ul> 

或者,如果你想顯示只有第一個信息:

<%= user.infos.any? ? user.infos.first.comment : "N/A" %> 

小心最新的解決方案:user.infos永遠是零,但user.infos.first可以是零,所以你必須檢查可用的相關信息與user.infos.any?