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

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

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

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

Q&A

1回答

735閲覧

Flashメッセージのレンダリング先でのnomethod error

borashisan

総合スコア1

Ruby on Rails 5

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

0グッド

0クリップ

投稿2021/04/06 09:26

前提・実現したいこと

プログラミング初心者です。
Railsでアンケートを共有するSNSを作っています。
投稿機能を実装中に無効な投稿をした際にFlashメッセージを表示し,表示したいビューをレンダリングする際に以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

NoMethodError in Microposts#create
Showing /home/ubuntu/environment/docs_comm/app/views/users/show.html.erb where line #6 raised:

undefined method `email' for nil:NilClass

該当のソースコード

Rails

1module UsersHelper 2 3 # 引数で与えられたユーザーのGravatar画像を返す 4 def gravatar_for(user, options = { size: 80 }) 5 gravatar_id = Digest::MD5::hexdigest(user.email.downcase) 6 size = options[:size] 7 gravatar_url = "https://secure.gravatar.com/avatar/#{gravatar_id}?s=#{size}" 8 image_tag(gravatar_url, alt: user.name, class: "gravatar") 9 end 10end

Rails

1<div class="container"> 2 <div class="row"> 3 <aside class="col-md-8"> 4 <section class="user_info"> 5 <h1> 6 <%= gravatar_for @user %> 7 <%= @user.name %> 8 </h1> 9 </section> 10 <section class="micropost_form"> 11 <%= render 'shared/micropost_form' %> 12 </section> 13 </aside> 14 <div class="col-md-8"> 15 <% if @user.microposts.any? %> 16 <h3>投稿 (<%= @user.microposts.count %>)</h3> 17 <ol class="microposts"> 18 <%= render @microposts %> 19 </ol> 20 <%= will_paginate @microposts %> 21 <% end %> 22 </div> 23 </div> 24</div>

Rails

1class MicropostsController < ApplicationController 2 before_action :logged_in_user,only:[:create,:destroy] 3 def create 4 @micropost = current_user.microposts.build(micropost_params) 5 if @micropost.save 6 flash[:success] = "フォームが投稿されました" 7 redirect_to root_url 8 else 9 render template: 'users/show' #どこをレンダリングさせるべきかわかっていない 10 end 11 end 12 13 14 def destroy 15 end 16 17 def micropost_params 18 params.require(:micropost).permit(:content) 19 end 20end

Rails

1<%= form_for(@micropost) do |f| %> 2 <%= render 'shared/error_messages', object: f.object %> 3 <div class="field"> 4 <%= f.text_area :content, placeholder: "https://docs.google.com/forms/d/e/1FAIpQLS..." %> 5 </div> 6 <%= f.submit "投稿", class: "btn btn-primary" %> 7<% end %>

試したこと

gravatar絡みのエラーだと思い、該当コードを消したら動くかなど試してみましたがいまいちピンときませんでした。なんとなく初歩的な問題だろうとは感じていますが初めて自力で対処できない問題に直面したのでお力をお借りしたいです。

補足情報(FW/ツールのバージョンなど)

Rails 5.1.6
Ruby 2.6.3

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

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

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

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

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

guest

回答1

0

Railsチュートリアルとは異なり、 Userコントローラーのviewアクションをレンダリングしようとして今回のようなエラーが起きてしまいましたが、Railsチュートリアルと同じく、同チュートリアルでいうところのStatic_Pagesコントローラーのhomeアクションをレンダリングしたら正常に動きました。一旦妥協して開発を進めようとは思いますが根本的解決にはなっていないのでどうしてStatic_PagesコントローラーでできてUserコントローラーでできないのか理由が分かる方がいらっしゃいましたら教えていただきたいです。

投稿2021/04/06 18:42

borashisan

総合スコア1

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問