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

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

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

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

解決済

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

harukome
harukome

総合スコア26

Ruby on Rails 6

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

2回答

0評価

0クリップ

162閲覧

投稿2022/04/24 08:01

編集2022/04/27 11:01

前提

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'

試したこと

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

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

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

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Ruby on Rails 6

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