Belongs_to无法正常工作

时间:2014-09-11 08:35:35

标签: ruby-on-rails ruby ruby-on-rails-4.1

我有这个问题: enter image description here

我有这段代码:

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

4 个答案:

答案 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 :statuseshas_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) %>

当没有用户关联时,上述内容不会引发错误。

相关问题