在我的视图中获取“未定义的方法`current_weight'为nil:NilClass”

时间:2012-09-16 15:23:37

标签: ruby-on-rails ruby-on-rails-3

我的应用程序应该允许用户创建status_update,它通过名为'previous_status_update'的方法从之前的status_update中提取信息。

在我看来,我有这段代码:

<span> <%= status_update.current_weight - status_update.previous_status_update.current_weight %></span> 

在我的模型中,我有相应的代码:

after_find :previous_status_update  

 def previous_status_update
 current_id = self.id
 previous_status_update = user.status_update.where( "created_at < ? ", self.created_at ).first
end  

在控制台中,以下命令按顺序完美运行:

user = User.find_by_id(3)
#<User id: 3, email: "example-3@r

status = user.status_update.first
#<StatusUpdate id: 73, created_at: "2012-09-13 23:08:35",......

status.previous_status_update
#<StatusUpdate id: 68, created_at: "2012-09-13 23:08:35".....

prev_stat = status.previous_status_update
prev_stat.current_weight 
=> 168

我猜测问题是模型没有将活动记录对象放入可以像对象一样调用的实例变量中。相反,我只是有一个方法调用,它返回活动记录对象,但不是可以为属性调用的形式。

我认为我不能将整个对象存储在名为“previous_status_update”的数据库列中......


我认为此错误的另一种可能性是它指向示例数据中没有先前状态更新的第一个条目。因此,当程序试图提出一个值时,它只返回nil。我认为这就是错误所指的内容。

所以真的,我需要的是让rails放松一下这个例外。

2 个答案:

答案 0 :(得分:0)

您是否尝试将控制器的状态更新移交为符号:@status_update?

我认为你会得到错误,因为视图无法对status_update执行某些操作,因为它的nil然后是第一次访问

<span> <%= status_update.current_weight - ...

尝试在控制器中设置@status_update并像这样修改你的视图

<span> <%= @status_update.current_weight - @status_update.previous_status_update.current_weight %></span> 

答案 1 :(得分:0)

我解决这个问题的方法是将第一个状态更新返回给不存在的“上一个”状态更新。

这解决了这个问题。

以下是该方法的样子:

 def previous_status_update
 previous_status_update = user.status_update.where( "created_at < ? ", self.created_at ).first   
 if previous_status_update == nil
   return self
 else
   previous_status_update
 end
end