0

これは teamtreehouse.com での演習です。

user.rb

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

  # Setup accessible (or protected) attributes for your model
  attr_accessible :email, :password, :password_confirmation, :remember_me,
                  :first_name, :last_name, :profile_name

  validates :first_name, presence: true

  validates :last_name, presence: true

  validates :profile_name, presence: true,
                           uniqueness: true

  has_many :statuses

  def full_name
    first_name + " " + last_name
  end
end

status.rb

class Status < ActiveRecord::Base
  attr_accessible :content, :user_id
  belongs_to :user
end

次のエラーが表示されます。

undefined method 'full_name' for nil:NilClass

/app/views/statuses/index.html.erb の 9 行目を表示:

6: 
7: <% @statuses.each do |status| %>
8: <div class="status">
9:  <strong><%= status.user.full_name %></strong>
10:     <p><%= status.content %></p>
11:     <div class="meta">
12:       <%= link_to time_ago_in_words(status.created_at) + " ago", status %>

その理由を本当に理解したいです。

4

4 に答える 4

1

問題は、ユーザー部分の前にステータス部分を構築していたときに、first_name または last_name を持たないテスト ステータスを生成したことでした。

それを修正する方法は、レールコンソールタイプを開くことでしたrails console:Status.delete_all

于 2013-04-30T01:13:30.603 に答える
1

エラーは、一部のレコードにいずれかの名前がないためです。次のコードを使用してエラーを回避できます。

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

full_name が機能する場合は、文字列を別の方法で配置します "" または nil を配置します

于 2013-08-06T18:22:07.847 に答える
0

モデルに属性を追加しfull_nameます。

attr_accessible :full_name

次に、

 def full_name
    first_name + " " + last_name
  end

次のように、

  def full_name
    self.full_name = self.first_name + " " + self.last_name
  end
于 2013-04-29T06:18:26.820 に答える