2011-11-03 73 views
1

模式:Rails的,的has_many,belongs_to的

create_table "reports", :force => true do |t| 
    t.integer "user_id" 
    t.string "apparatus" 
    t.string "capt" 
    t.text  "body" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    end 

    create_table "users", :force => true do |t| 
    t.string "login",      :limit => 40 
    t.string "name",      :limit => 100, :default => "" 
    t.string "email",      :limit => 100 
    t.string "crypted_password",   :limit => 40 
    t.string "salt",      :limit => 40 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    t.string "remember_token",   :limit => 40 
    t.datetime "remember_token_expires_at" 
    t.string "rank" 
    t.integer "shift" 
    t.integer "access" 
    end 

用戶模型:

Class User < ActiveRecord::Base 
    has_many :reports 
# bunch of other stuff thats not important 
end 

報表模型:

Class Report < ActiveRecord::Base 
    belongs_to :user 
end 

的意見/報告/指數

<% @reports.each do |report| %> 
    <tr> 
    <td><%= report.user_id %></td> #  ****THIS IS THE LINE IN QUESTION**** 
    <td><%= report.apparatus %></td> 
    <td><%= report.capt %></td> 
    <td><%= report.body %></td> 
    <td><%= link_to 'Show', report %></td> 
    <td><%= link_to 'Edit', edit_report_path(report) %></td> 
    <td><%= link_to 'Destroy', report, :confirm => 'Are you sure?', :method => :delete %></td> 
    </tr> 
<% end %> 

我希望能夠顯示創建報告的用戶的名稱。我假設聲明belongs_to和has_many關聯可以通過編寫report.user.name或類似的東西來實現。我哪裏錯了?

+0

OK,問題是我在我的表中的一個元組是沒有一個用戶ID。所以它試圖在nil上找到名稱方法。我是一個屁股。 –

回答

3

我99%肯定它是因爲一個或多個您的報告不具有關聯的用戶。嘗試

<%= report.user.name rescue "none" %> 

當有一個報告中USER_ID字段中沒有值,則report.user將返回零。所以report.user.name就像是調用nil.name,這會引發錯誤。

更新:這是一個更好的辦法:

<%= report.user.try(:name) %> 
+0

是的,這就是它。 –

1

你可以這樣做:

<%= report.user.name %> 

但求效益,在你的控制器,你可以做一個加入用來獲取@reports相同的查詢,以獲得用戶名。

此查詢可能看起來像:

@reports = Report.select("reports.id as id, reports.apparatus as apparatus, reports.capt as capt, reports.body as body, users.name as user_name").joins("LEFT JOIN `users` ON `users`.`id` = `reports`.`user_id`") 

然後你的輸出看起來像:

<%= report.user_name %> 
+0

<%= report.user.name%>尚未運行。 它給「未定義的方法名稱」「 –

+0

好的,問題是我有一個在我的表中沒有用戶ID的tupple。所以它試圖在nil上找到名稱方法。我是一個屁股。 –

+0

我有點晚了,但很高興你明白了! –