0

私のアプリは、ユーザーが「previous_status_update」と呼ばれるメソッドを介して以前の 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 が返されます。これがエラーの意味だと思います。

本当に、私が必要としているのは、レールがその例外で冷静になることです。

4

2 に答える 2

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    
于 2012-09-17T03:25:00.823 に答える
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> 
于 2012-09-16T22:13:25.177 に答える