94992


作成した掲載を他者に提案機能として送り付ける機能を付けたのですが、通知機能で、提案された際に通知が来るようにしたいです。  
そこで下記のサイトのコメントの通知機能を参考に提案された人に通知がくるようなコードを書いているのですが、エラーが発生しました。

[Railsで通知機能を誰でも実装できるように解説する](https://qiita.com/nekojoker/items/80448944ec9aaae48d0a)  
[Railsで通知機能の実装](https://qiita.com/bty__/items/2db1dd4fcd7945b980f7)  
[RailsでDMが届いた際の通知機能を実装する](https://qiita.com/Shuhei_Nakada/items/430431356cdfccb1abcf)  
[![画像の説明をここに入力](https://i.stack.imgur.com/75Ekt.png)](https://i.stack.imgur.com/75Ekt.png)

エラーは恐らく通知を通知テーブル(notifications)に保存するコードの箇所(plan.rb)でエラーが起きたのだと思います。  
何処がおかしいのか拝見して頂きたいです。

エラー箇所  
plan.rbの通知機能箇所

[code]

    def create_notification_suggest!(current_user, suggest_id)
            #同じ掲載に提案しているユーザーに通知を送る。（current_userと投稿ユーザーのぞく）
            temp_ids = Suggest.where(plan_id: id).where.not("user_id=? or user_id=?", current_user.id,user_id).select(:user_id).distinct
            #取得したユーザー達へ通知を作成。（user_idのみ繰り返し取得）
            temp_ids.each do |temp_id|
              save_notification_suggest!(current_user, suggest_id, temp_id['user_id'])
            end
            #掲載者へ通知を作成
            save_notification_suggest!(current_user, suggest_id, user_id)
        end
        
        def save_notification_suggest!(current_user, suggest_id, visited_id)
            notification = current_user.active_notifications.new(
              plan_id: id,
              suggest_id: comment_id,
              visited_id: visited_id,
              action: 'suggest'
            )
            if notification.visitor_id == notification.visited_id
              notification.checked = true
            end
            notification.save if notification.valid?
        end
    
[/code]

表示されている  
suggest_controller.rbの通知機能記述箇所

[code]

    def create
            @suggest = current_user.suggests.build(suggest_params)
            if @suggest.save
              flash[:success] = '提案を送りました'
              # 以下通知機能の箇所
              @plan=@suggest.plan
              @plan.create_notification_suggest!(current_user, @suggest.id)
              # 以上通知機能の箇所
              redirect_to root_url
            else
              @suggests = current_user.suggests.order(id: :desc)
              flash[:danger] = '提案を送れませんでした'
              redirect_to request.referer
            end
        end
    
[/code]

notifications_helper

[code]

    module NotificationsHelper
        def notification_form(notification)
          #通知を送ってきたユーザーを取得
          @visitor = notification.visitor
          #コメントの内容を通知に表示する
          @suggest = nil
          @visitor_suggest = notification.suggest_id
          case notification.action
          when 'suggest' then
            #コメントの内容と投稿のタイトルを取得　      
            @suggest = Suggest.find_by(id: @visitor_suggest)
            @suggest_message =@suggest.message
            @suggest_title =@suggest.title
            tag.a(@visitor.name, href: user_path(@visitor)) + 'が' + tag.a("#{@suggest_title}", href: plan_path(notification.plan_id)) + 'を提案しました'
          end
        end
    end
    
[/code]

！追記  
suggest.rbにbelongs_to
:planを追記するのを忘れていましたので、追記したことにより、suggest_contorollerの@plan=@suggest.plan_idではなく、@plan=@suggest.planで取得できるようになりました。


CC BY-SA 4.0
2023-05-25T11:22:33.290
94975
2023-05-28T01:38:21.740
2023-05-28T01:28:36.033
58130
58130
question
ruby-on-rails ruby
通知機能のエラーについて


Suggestに関連したPlanを取得したいのであれば`@plan=@suggest.plan`とすべきですが、SuggestとPlanの[関連付け](https://railsguides.jp/association_basics.html)がちゃんとできていなかったため、メソッドひとつでPlanを取得できる状態になっていなかったと言うことです。次のいずれかを設定すると良いでしょう。

  * Suggestクラスやマイグレーションで`belongs_to`を使い、関連付けを行って、`@plan=@suggest.plan`とする。

  * 関連付けができない事情があれば、`@plan=Plan.find(@suggest.plan_id)`のように取得したPlanのIDでPlanを取得する。

機能の実装よりも、モデル同士の関連付けがどうなるのを整理してから、実装していくといいかと思います。ひとまず、これで「この質問での問題」は解決できるかと思います。その後に別のエラーが起きたら、それは別の問題になります。


CC BY-SA 4.0
2023-05-28T01:38:21.740
94992
2023-05-28T01:38:21.740
7347
94975
answer