前提
ruby on railsで日記を共有するSNSのようなものを製作しています。
投稿に対して「いいね」やコメントが付けられたときに、アクションをされた側にmailerを使って通知したいと思っています。
「いいね」機能は実装済みです。
ユーザーの機能はdeviseを使っていて、メール認証の機能を付けました。そちらは正常に作動しています。
実現したいこと
- 「いいね」をされた側にメールで通知を送る
発生している問題・エラーメッセージ
以下のエラーメッセージが表示されています。
notification_mailer.rbの@likeuser = params[:likeuser]の部分に赤線
NoMethodError in LikesController#create undefined method `[]' for nil:NilClass
該当のソースコード
1,mailerファイル
notification_mailer.rb
class NotificationMailer < ApplicationMailer def send_when_liked @likeuser = params[:likeuser] @likeduser = params[:likeduser] @post = params[:post] mail(to: @likeduser.email, subject: 'あなたの投稿にいいねがつきました') end end
application_mailer.rb
class ApplicationMailer < ActionMailer::Base default from: "TestLife運営" layout 'mailer' end
2,likesコントローラー
likes_controller
def create like = current_user.likes.create(post_id: params[:post_id]) @post = Post.find(params[:post_id]) #いいねされた投稿の取得 @likeduser = User.find(post.user_id) #いいねされたユーザーの取得 NotificationMailer.send_when_liked.with(likeuser: @likeuser, likeduser: @likeduser, post: @post).deliver redirect_back(fallback_location: root_path) end
3,postsコントローラー
posts_controller
def show_public @post = Post.find(params[:id]) @comments = @post.comments @comment = Comment.new @link = "コメントする" end
4,「いいね」をする投稿詳細ページのview
posts/show_public.html.erb
<div class="post"> <p>1,タイトル</p> <p><%= @post.title %></p> <p>2,登場人物の名前</p> <p> <% @post.characters_posts.each do |t| %> <% if t.present? %> <p><%= t.character.name %></p> <% else %> <P>この話に登場人物は登録されていません</P> <% end %> <% end %> </p> <p>3,振り返ろうと思った理由</p> <p><%= @post.reason %></p> <p>4,出来事の詳細</p> <p><%= @post.experiment %></p> <p>5,振り返ってみた感想</p> <p><%= @post.review %></p> <% if user_signed_in? %> <% if current_user.already_liked?(@post) %> <%= link_to post_like_path(@post), method: :delete do %> <p>いいねを取り消す</p> <% end %> <% else %> <%= link_to post_likes_path(@post), method: :post do %> <p>いいね</p> <% end %> <% end %> <% end %>
5,mailerのviewファイル
notification_mailer/send_when_liked.html.erb
<h1>Notification#send_when_liked</h1> <!DOCTYPE html> <html lang="ja"> <head> <meta content="text/html; charset=UTF-8"> </head> <body> <p><%= @likeuser.name %>さんが貴方の書いた「<%= @post.title %>」に「いいね」をしました。</p> <p>早速////をclickして確認してみましょう</p> </body> </html>
notification_mailer/send_when_liked.text.erb
Notification#send_when_liked <%= @likeuser.name %>さんが貴方の書いた「<%= @post.title %>」に「いいね」をしました。 早速////をclickして確認してみましょう
エラーメッセージ
「いいね」ボタンを押した後のコマンドプロンプトは以下のように動きます。
Started POST "/posts/2/likes" for ::1 at 2022-04-26 09:45:44 +0900 Processing by LikesController#create as HTML Parameters: {"authenticity_token"=>"[FILTERED]", "post_id"=>"2"} User Load (0.5ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? ORDER BY "users"."id" ASC LIMIT ? [["id", 1], ["LIMIT", 1]] TRANSACTION (0.3ms) begin transaction ↳ app/controllers/likes_controller.rb:3:in `create' Post Load (0.7ms) SELECT "posts".* FROM "posts" WHERE "posts"."id" = ? LIMIT ? [["id", 2], ["LIMIT", 1]] ↳ app/controllers/likes_controller.rb:3:in `create' Like Exists? (0.7ms) SELECT 1 AS one FROM "likes" WHERE "likes"."post_id" = ? AND "likes"."user_id" = ? LIMIT ? [["post_id", 2], ["user_id", 1], ["LIMIT", 1]] ↳ app/controllers/likes_controller.rb:3:in `create' Like Create (4.2ms) INSERT INTO "likes" ("post_id", "user_id", "created_at", "updated_at") VALUES (?, ?, ?, ?) [["post_id", 2], ["user_id", 1], ["created_at", "2022-04-26 00:45:45.031631"], ["updated_at", "2022-04-26 00:45:45.031631"]] ↳ app/controllers/likes_controller.rb:3:in `create' TRANSACTION (10.2ms) commit transaction ↳ app/controllers/likes_controller.rb:3:in `create' Post Load (0.7ms) SELECT "posts".* FROM "posts" WHERE "posts"."id" = ? LIMIT ? [["id", 2], ["LIMIT", 1]] ↳ app/controllers/likes_controller.rb:4:in `create' User Load (0.6ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 3], ["LIMIT", 1]] ↳ app/controllers/likes_controller.rb:6:in `create' NotificationMailer#send_when_liked: processed outbound mail in 5.4ms Completed 500 Internal Server Error in 507ms (ActiveRecord: 17.9ms | Allocations: 15891) NoMethodError (undefined method `[]' for nil:NilClass): app/mailers/notification_mailer.rb:9:in `send_when_liked' app/controllers/likes_controller.rb:7:in `create'
試したこと
- 現在のコードからlikeコントローラーの記述のみ変更
【変更前】
NotificationMailer.send_when_liked.with(likeuser: @likeuser, likeduser: @likeduser, post: @post).deliver
【変更後】
NotificationMailer.with(likeuser: @likeuser, likeduser: @likeduser, post: @post).send_when_liked.deliver
【結果】
以下のエラーメッセージが出ました
Net::SMTPFatalError in LikesController#create 555 5.5.2 Syntax error. o11-20020a62cd0b000000b0050d3365725csm6429534pfg.105 - gsmtp
- 現在のコードからnotification_mailerの記述の変更
【変更前】
def send_when_liked
【変更後】
def send_when_liked(likeuser, likeduser, post)
【結果】
以下のエラーメッセージが出ました
ArgumentError in LikesController#create wrong number of arguments (given 0, expected 3)
参考サイト
以下のサイトを参考に実装を試みました。
エラー画面を確認すると、
Parameters:
{"_method"=>"post", "authenticity_token"=>"[FILTERED]", "post_id"=>"2"}
と表示されていたので、ユーザー情報などがパラメーターがコントローラー側に上手くわたっていないのかなと考えています。
まだ回答がついていません
会員登録して回答してみよう