2014-09-11 64 views
1

我有這樣的問題: enter image description herebelongs_to的工作不正常

而且我有這樣的代碼:

user.rb:

class User < ActiveRecord::Base 
    # Include default devise modules. Others available are: 
    # :confirmable, :lockable, :timeoutable and :omniauthable 
    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable 

    def full_name 
    "lalalala" 
    end 
end 

status.rb:

class Status < ActiveRecord::Base 

    belongs_to :user 
end 

show.html.erb:

<p id="notice"><%= notice %></p> 

<p> 
    <strong>Name:</strong> 
    <%= @status.user.full_name %> 
</p> 

<p> 
    <strong>Content:</strong> 
    <%= @status.content %> 
</p> 

<%= link_to 'Edit', edit_status_path(@status) %> | 
<%= link_to 'Back', statuses_path %> 

我在這裏錯過了什麼?我無法訪問full_name方法,但我不知道爲什麼。我是Ruby-on-Rails的新手,所以它必須是一些我不瞭解的簡單細節。 rails版本:4.1.5;紅寶石版本:2.1.2

回答

3

Marek的評論,你也想看看使用.delegate方法,防止Law Of Demeter(有不止一個‘點’,以調用一個方法):

#app/models/status.rb 
class Status < ActiveRecord::Base 
    belongs_to :user 
    delegate :full_name, to: :user, prefix: true 
end 

這會給你打電話的能力:

@status.user_full_name 

有效性

由於Marek表示,您可能沒有任何與您的status關聯的user對象。

要確定是否這是問題,你需要使用一個conditional statement檢查調用它之前,如果user物體實際存在:

<%= @status.user_full_name if @status.user.present? %> 

這會給你打電話的相關user的能力對象存在

+1

1 + ..讓新的東西要知道'.delegate'方法.. – 2014-09-11 09:49:38

4

你有你需要在您的錯誤信息。您的Status記錄沒有關聯User記錄,因此@status.user返回nil

0

你不是已經與用戶相關的@status

<%= @status.user.try(:full_name) %> 

以上當沒有用戶關聯時不會引發錯誤。

2

以上所有答案都可以解決您的查看問題。但是由於當前的代碼,您可能會遇到很多問題。

幾件事情,我發現,創造的問題:

1:你得到@status.user爲零。這意味着您的user_id列(必須在那裏)狀態設置不正確。因此,首先設置,然後使用上面的解決方案來解救你的錯誤。

第二:您沒有在您的狀態模型中指定任何關係。您的用戶模型中應該有has_many :statuseshas_one :status

第3步:確保在狀態表中正確填充了user_id列。嘗試創建它象下面這樣:

,如果您有has_one關係:

@user_object.status.create(status_params) 

,如果您有has_many關係:

@user_object.statuses.create(status_params)