前提
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
1class NotificationMailer < ApplicationMailer 2 3 def send_when_liked 4 @likeuser = params[:likeuser] 5 @likeduser = params[:likeduser] 6 @post = params[:post] 7 mail(to: @likeduser.email, subject: 'あなたの投稿にいいねがつきました') 8 end 9end
application_mailer.rb
1class ApplicationMailer < ActionMailer::Base 2 default from: "TestLife運営" 3 layout 'mailer' 4end 5
2,likesコントローラー
likes_controller
1 def create 2 like = current_user.likes.create(post_id: params[:post_id]) 3 @post = Post.find(params[:post_id]) #いいねされた投稿の取得 4 @likeduser = User.find(post.user_id) #いいねされたユーザーの取得 5 NotificationMailer.send_when_liked.with(likeuser: @likeuser, likeduser: @likeduser, post: @post).deliver 6 redirect_back(fallback_location: root_path) 7 end
3,postsコントローラー
posts_controller
1 def show_public 2 @post = Post.find(params[:id]) 3 @comments = @post.comments 4 @comment = Comment.new 5 @link = "コメントする" 6 end
4,「いいね」をする投稿詳細ページのview
posts/show_public.html.erb
1<div class="post"> 2 <p>1,タイトル</p> 3 <p><%= @post.title %></p> 4 <p>2,登場人物の名前</p> 5 <p> 6 <% @post.characters_posts.each do |t| %> 7 <% if t.present? %> 8 <p><%= t.character.name %></p> 9 <% else %> 10 <P>この話に登場人物は登録されていません</P> 11 <% end %> 12 <% end %> 13 </p> 14 <p>3,振り返ろうと思った理由</p> 15 <p><%= @post.reason %></p> 16 <p>4,出来事の詳細</p> 17 <p><%= @post.experiment %></p> 18 <p>5,振り返ってみた感想</p> 19 <p><%= @post.review %></p> 20 21<% if user_signed_in? %> 22 <% if current_user.already_liked?(@post) %> 23 <%= link_to post_like_path(@post), method: :delete do %> 24 <p>いいねを取り消す</p> 25 <% end %> 26 <% else %> 27 <%= link_to post_likes_path(@post), method: :post do %> 28 <p>いいね</p> 29 <% end %> 30 <% end %> 31<% end %>
5,mailerのviewファイル
notification_mailer/send_when_liked.html.erb
1<h1>Notification#send_when_liked</h1> 2 3 <!DOCTYPE html> 4 <html lang="ja"> 5 <head> 6 <meta content="text/html; charset=UTF-8"> 7 </head> 8 <body> 9 <p><%= @likeuser.name %>さんが貴方の書いた「<%= @post.title %>」に「いいね」をしました。</p> 10 <p>早速////をclickして確認してみましょう</p> 11 </body> 12 </html>
notification_mailer/send_when_liked.text.erb
1Notification#send_when_liked 2 3<%= @likeuser.name %>さんが貴方の書いた「<%= @post.title %>」に「いいね」をしました。 4早速////を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"}
と表示されていたので、ユーザー情報などがパラメーターがコントローラー側に上手くわたっていないのかなと考えています。
回答2件
あなたの回答
tips
プレビュー