2017-04-19 7 views
0

私は、フィードバックモデルのフィードバックメソッドでユーザーにフィードバックできるようにしようとしています。Railsモデル上のメソッド内で条件を作る方法

はとてもモデルにおける条件付きにすることを示していますが、ログに

NoMethodError(NilClass nilのための未定義のメソッド `total_feedbacks')を示して?

def feedback_product 
    user = User.find_by_id(attributes['user_id']) 

    if user 
    product.total_feedbacks += 1 
    product.average_rating = product.feedbacks.where('buyer_feedback_date IS NOT NULL').rated(Feedback::FROM_BUYERS).average(:buyer_rating) 
    product.save 
    end 
end 


belongs_to :user
フィードバックし、ユーザー
has_many :feedbacks

+0

を存在しない限り、エラーを上げますか?それは 'nil'と思われる。 –

+0

最大ユーザーなしの条件付き作品 – bookaka

+0

しかし、フィードバックは1つの製品を持っています – bookaka

答えて

0

あなたの質問は完全に明確ではありません。あなたはこのコードが内部にあり、あなたの状態が大丈夫と思われるモデルについて言及していませんでした。

productがnilだと思われるので、その製品のインスタンス化のように質問に記載されていないものが見つからないことがあります。または、あなたの条件を次のようにしたい場合があります。

if user && product 
+0

Samirはフィードバックモデルの中にありがとうございました 私はちょうどグラブしてそこに置くことはできませんでした。フィードバック/注文関連製品 – bookaka

+0

私のアプローチに加えて、@maxpleは、あなたの問題を解決するための素晴らしいオプションを提供しました。それは本当にあなたがアプリケーションをどのように動作させたいかによって異なります。このエラーを避けたいのであれば、自分のアプローチを使うか、最大3番目のアプローチを使うかのどちらかです。 –

0

この方法では問題のモデルに既存の製品があることが前提です。ただし、レコードが作成されていない場合、製品はゼロになります。

これはいくつかの方法で対処することができますが、これは使用するケースによって異なります。

  1. このモデルが保存時に商品を作成することを確認します。

    before_save :ensure_product_exists 
    def ensure_product_exists 
        product ||= Product.create(foo_id: self.id) # replace with correct foreign key 
    end 
    
  2. 例えば、それはまだ存在しない場合は、この方法は、製品を作成すること:before_saveて製品が存在しない場合は

    product ||= Product.new(foo_id: self.id) # replace with correct foreign key 
    
  3. 例えば、初期のメソッドの戻り値を作成します

    return unless product 
    
  4. 製品は `product`が定義されているか

    raise(RuntimeError, "product doesn't exist") unless product 
    
+0

ありがとうございます。説明のために。私はあなたの方法を使用しようとします。モデルに関連した既に製品をつかんでいる。 商品は存在しますが、関連するモデルと関連しています – bookaka

関連する問題