我有这个问题:
我有这段代码:
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; ruby版本:2.1.2
答案 0 :(得分:4)
您在错误消息中拥有所需的一切。您的Status
记录没有关联的User
记录,因此@status.user
会返回nil
。
答案 1 :(得分: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
所述,您可能没有与user
相关联的status
个对象。
要确定这是否是问题,您需要使用conditional statement在调用之前检查user
对象是否确实存在:
<%= @status.user_full_name if @status.user.present? %>
这将使您能够调用关联的user
对象存在
答案 2 :(得分:2)
以上所有答案都可以解决您的观点问题。但是由于您当前的代码,您可能面临许多问题。
我发现创建问题的几件事情:
第1名:你的@status.user
为零。这意味着您的user_id
列(必须在那里)状态未正确设置。所以首先设置然后使用上面的解决方案来帮助你摆脱错误。
第二:您没有在状态模型中指定任何关系。您的用户模型应该有has_many :statuses
或has_one :status
。
第3步:确保在状态表中正确填充了user_id列。尝试创建如下:
如果你有has_one
关系:
@user_object.status.create(status_params)
如果你有has_many
关系:
@user_object.statuses.create(status_params)
答案 3 :(得分:0)
您没有与@status相关联的用户
<%= @status.user.try(:full_name) %>
当没有用户关联时,上述内容不会引发错误。