質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

2回答

633閲覧

mailerを使って「いいね」の通知メールを送ろうとしているがエラーが出る(NoMethodError (undefined method `[]' for nil:NilClass):)

harukome

総合スコア26

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2022/04/24 08:01

編集2022/04/27 01:50

前提

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'

試したこと

  1. 現在のコードから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
  1. 現在のコードから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"}
と表示されていたので、ユーザー情報などがパラメーターがコントローラー側に上手くわたっていないのかなと考えています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

winterboum

2022/04/24 09:02

エラーメッセージは全体を載せてください
harukome

2022/04/24 11:29

不必要な部分まで載っているかもしれないですが追記しました! ご確認よろしくお願いします。
winterboum

2022/04/24 11:53

app/mailers/notification_mailer.rb:9 ってどの行ですか
harukome

2022/04/24 11:57

#が付いているところが9行目です! def send_when_liked #@likeuser = params[:likeuser] @likeduser = params[:likeduser] @post = params[:post] mail(to: @likeduser.email, subject: 'あなたの投稿にいいねがつきました') end end
guest

回答2

0

自己解決

likesコントローラーを以下のように変更したうえで、

likes_controller.rb

1NotificationMailer.with(likeuser: @likeuser, likeduser: @likeduser, post: @post).send_when_liked.deliver

application_mailer.rbのdefaultを以下のように変更したところ解決しました。

application_mailer.rb

1default from: "USINGADDRESS@gmail.com"

参考にしていたサイト(Railsでメール自動配信機能をつくるまでの道程
)で「fromはメールの送信元名」と書いてあり、そうするとアドレス以外にfromで設定した名前が表示されるようになるとのことでしたが、fromにはメール送信のために使用しているアドレスを記入しなければならなかったようです。

投稿2022/04/27 02:01

harukome

総合スコア26

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

NotificationMailer.send_when_liked.with

NotificationMailer.with( ).send_when_liked
とするとどうなりますか

投稿2022/04/24 12:20

winterboum

総合スコア23347

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

harukome

2022/04/25 04:08

NoMethodError in Likes#createが出ました。 コントローラーは以下のように動いていました。 (見にくかったらすみません、、!) Started POST "/posts/2/likes" for ::1 at 2022-04-25 13:06:13 +0900 Processing by LikesController#create as HTML Parameters: {"authenticity_token"=>"[FILTERED]", "post_id"=>"2"} User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? ORDER BY "users"."id" ASC LIMIT ? [["id", 1], ["LIMIT", 1]] TRANSACTION (0.1ms) begin transaction ↳ app/controllers/likes_controller.rb:3:in `create' Post Load (0.2ms) SELECT "posts".* FROM "posts" WHERE "posts"."id" = ? LIMIT ? [["id", 2], ["LIMIT", 1]] ↳ app/controllers/likes_controller.rb:3:in `create' Like Exists? (0.2ms) 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 (1.2ms) INSERT INTO "likes" ("post_id", "user_id", "created_at", "updated_at") VALUES (?, ?, ?, ?) [["post_id", 2], ["user_id", 1], ["created_at", "2022-04-25 04:06:13.631224"], ["updated_at", "2022-04-25 04:06:13.631224"]] ↳ app/controllers/likes_controller.rb:3:in `create' TRANSACTION (5.7ms) commit transaction ↳ app/controllers/likes_controller.rb:3:in `create' Post Load (0.2ms) SELECT "posts".* FROM "posts" WHERE "posts"."id" = ? LIMIT ? [["id", 2], ["LIMIT", 1]] ↳ app/controllers/likes_controller.rb:4:in `create' User Load (0.7ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 3], ["LIMIT", 1]] ↳ app/controllers/likes_controller.rb:6:in `create' Rendering layout layouts/mailer.html.erb Rendering notification_mailer/send_when_liked.html.erb within layouts/mailer Rendered notification_mailer/send_when_liked.html.erb within layouts/mailer (Duration: 5.7ms | Allocations: 1977) Rendered layout layouts/mailer.html.erb (Duration: 6.9ms | Allocations: 2041) NotificationMailer#send_when_liked: processed outbound mail in 19.4ms Completed 500 Internal Server Error in 101ms (ActiveRecord: 8.4ms | Allocations: 12937) ActionView::Template::Error (undefined method `name' for 1:Integer): 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> app/views/notification_mailer/send_when_liked.html.erb:9 app/mailers/notification_mailer.rb:12:in `send_when_liked' app/controllers/likes_controller.rb:8:in `create'
winterboum

2022/04/25 04:11

undefined method `name' for 1:Integer って言われてるではないですか @likeuser.name の @likeuser が Userのインスタンスになっていないのです
harukome

2022/04/25 05:01

likeコントローラーの#の部分か、 #likeuser = current_user.id likeduser = User.find(post.user_id) #NotificationMailer.with(likeuser: likeuser, likeduser: likeduser, post: post).send_when_liked.deliver notification_mailer.rbの#の部分 def send_when_liked #@likeuser = params[:likeuser] @likeduser = params[:likeduser] @post = params[:post] mail(to: @likeduser.email, subject: 'あなたの投稿にいいねがつきました') end どちらかの文法が間違っているということでしょうか、、?
winterboum

2022/04/25 23:48

文法が間違えてたら文法エラーって言われます。 @likeduser = params[:likeduser] これは User ではなく Userの ID ですよね?
winterboum

2022/04/25 23:52

ん? @likeuser か、@likeduser でなく。
winterboum

2022/04/25 23:53

修正したcodeを載せてください。 どこをどう直したのかがわからない。エラーが出たときのcodeです、必要なのは。
harukome

2022/04/26 00:56

現在のコードに修正しました。 ご確認よろしくお願いしたします。
winterboum

2022/04/26 01:48

現在のコードからlikeコントローラーの記述のみ変更 のときの「以下のエラーメッセージが出ました」を見ますとメールサーバーとのやり取りのところですから、mailerとcontrpllerのやり取りは問題ないです。 その他の修正は間違いです。 で、 削除したのかな、「Net::SMTPFatalError のエラーは何やらしたらなくなった ってありませんでしたっけ? それを活かしましょう
harukome

2022/04/27 01:48

処理される順番を考えてひとつひとつ確認したところ無事に解決することができました! アドバイスありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問