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

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

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

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 6

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

Q&A

解決済

1回答

1861閲覧

ローカル環境でのみサーバーエラーが出る

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 6

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

0グッド

0クリップ

投稿2020/10/05 08:29

編集2020/10/06 05:57

###起こっている問題

ローカル環境で記事の新規投稿画面(/posts/new)を開くとNoMethodErrorが発生します。
バリデーションエラーの際メッセージを表示するeach文に問題があるようなのですが、以前からずっと変えていない部分です。

▼ブラウザで表示されるエラー

Showing /Users/nawaryoga/filma/app/views/posts/new.html.erb where line #5 raised: undefined method `errors' for nil:NilClass Extracted source (around line #5): 3 <div class="posts-form-body"> 4  <%= form_tag("/posts/create") do %> 5   <% @post.errors.full_messages.each do |message| %> 6    <div class="form-error"> 7     <%= message %> 8    </div>

5行目に問題があるということは、エラーメッセージの呼び出しが間違っているのでしょうか?

development.logを見ると、以下のようにあります。

Started GET "/posts/new" for ::1 at 2020-10-05 16:28:38 +0900 Processing by PostsController#new as HTML Rendering posts/new.html.erb within layouts/application Rendered posts/new.html.erb within layouts/application (Duration: 1.2ms | Allocations: 1286) Completed 500 Internal Server Error in 2ms (ActiveRecord: 0.0ms | Allocations: 1732) ActionView::Template::Error (undefined method `errors' for nil:NilClass): 2: <div class="posts-form"> 3: <div class="posts-form-body"> 4: <%= form_tag("/posts/create") do %> 5: <% @post.errors.full_messages.each do |message| %> 6: <div class="form-error"> 7: <%= message %> 8: </div> app/views/posts/new.html.erb:5 app/views/posts/new.html.erb:4

以前から変えていない部分なので、どうして今になってエラーが出るのかがよくわかりません。
お分かりの方がいらっしゃいましたらご教授いただけませんでしょうか。

###補足

記事投稿画面のView▼

<%= form_tag("/posts/create") do %> <% @post.errors.full_messages.each do |message| %> <div class="form-error"> <%= message %> </div> <% end %> <input class="posts-button" type="submit" value="公開"> <div class="form-box posts-title-textarea"> <textarea name="title" class="posts-title" placeholder="記事タイトル" maxlegth="150"><%= @post.title %></textarea> </div> <div class="form-box posts-content-textarea"> <textarea name="content" class="posts-content" placeholder="初期値"><%= @post.content %></textarea> </div> <% end %>

バリデーションの設定▼

class Post < ApplicationRecord #validates :title, presence: true #validates :content, presence: true validate :add_error_sample def add_error_sample if title.blank? errors[:base] << "タイトルを入力してください" end if content.blank? errors[:base] << "記事内容を入力してください" end end end

コントローラ▼

class PostsController < ApplicationController def new end def index @posts = Post.all.order(created_at: :desc) end def create @post = Post.new( title: params[:title], content: params[:content] ) if @post.save redirect_to("/posts/index") else render("/posts/new") end end def show @post = Post.find_by(id: params[:id]) end end

開発環境

  • Rails6
  • Ruby2.6.6
  • puma
  • MySQL

他にすでに動いている本番環境がありますが、このエラーは出ていません。

本番環境

  • EC2
  • Nginx
  • puma
  • MySQL

MySQLのpostsテーブルで記事を管理するようにしていますが、現在どちらにもデータは入っていません。
カラムはid title content created_at updated_atで共通しています。

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

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

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

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

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

m.ts10806

2020/10/05 09:27

そもそもデータはちゃんと想定通り存在してるのでしょうか? 「ローカル環境でのみ」とのことですが、それ以外の動作している環境とデータをあわせた場合はどうでしょうか
退会済みユーザー

退会済みユーザー

2020/10/06 04:35

ご意見いただきありがとうございます。「想定通り存在しているデータ」とは何のことですか?データベース内のデータのことでしょうか。 だとしたら、同じテーブルとカラムは存在しています。
m.ts10806

2020/10/06 04:40

いえ、ですから 「ローカル環境"でのみ"」と書かれてると普通は「他にも動作している環境がある」と感じるわけです。 「それならその別の環境と同じデータでローカル環境動かしたらどうなる?」という確認です。何かおかしいこと聞いてますか?
退会済みユーザー

退会済みユーザー

2020/10/06 04:48

本当にごめんなさい、データというのが本当にわかりません。ソースコードや設定のことでしょうか? ローカルの他にはすでにデプロイしたAWS上の本番環境があり、そちらではNginxとpumaを使って動かしています。ローカルではrails sしてpumaだけで動かしている状態ですから、合わせるとしたらローカルでもNginxを使うということが考えられます。 そういうことを仰っているのでしょうか? (何がわかってないかもわかってない状態で、苛立たせてしまい本当に申し訳ございません)
m.ts10806

2020/10/06 05:19

>すでにデプロイしたAWS上の本番環境 はい、その環境のデータ です。 データとはデータベースのデータに他なりません。 問題切り分けを行う必要があります。 コードが同じならデータが違うから起きたのか、設定なのか 一つずつ見に行かなければなりません。 が、質問者さんは始めからローカル環境のことしか触れられていないので、こちらも答えようがない状態です。 「~のみ起きる」のであれば、起きる環境と起きない環境の違いを見ていくしかありません。データは環境より合わせやすいので、まずはデータを合わせて現象再現するか確認します。 もちろん「コードは全く同じ」前提ですけどね。 ひとまず、他の環境についても質問本文に追記いただけますか? ※ただ、全ての環境情報があったとしても、コードやデータまで提示されないと他者には再現できない=アドバイスしようが難しい 状態であることはご理解ください
退会済みユーザー

退会済みユーザー

2020/10/06 05:49

質問に追記させていただきました。 質問する上で必要な情報がわからず、ご迷惑をおかけして申し訳ありません。 他に必要な情報があったらご指摘いただけますと幸いです。
maisumakun

2020/10/06 05:52

「Extracted source」以前にエラーメッセージ本体が出ているかと思いますが、それはどのような内容でしょうか?
退会済みユーザー

退会済みユーザー

2020/10/06 05:57

Showing /Users/nawaryoga/filma/app/views/posts/new.html.erb where line #5 raised: undefined method `errors' for nil:NilClass このような内容です。
maisumakun

2020/10/06 06:00

「他にすでに動いている本番環境」でnewしても「エラーにはならず正常に動作する」のでしょうか? (詳細なエラーメッセージが出ずに「エラーである」ことを伝えるだけの画面にする、ということは本番環境ではよく行われます)
退会済みユーザー

退会済みユーザー

2020/10/06 06:07

本番環境では全く問題ありません。 ページは開けますし、何も入力せず『投稿する』を押下しても想定どおりバリデーションエラーのメッセージが表示されます。
maisumakun

2020/10/06 06:10

ApplicationControllerはどのようになっていますか? (このコードでは、むしろ「本番で動いている」ほうが理解できない状況です)
退会済みユーザー

退会済みユーザー

2020/10/06 06:12

class ApplicationController < ActionController::Base end こうなっています。
maisumakun

2020/10/06 06:15

どのようなgemを入れていますか?
guest

回答1

0

ベストアンサー

undefined method errors' for nil:NilClass`

エラーメッセージのとおりです。コントローラーで@postに何も設定していないので、nilとなります。

投稿2020/10/06 05:59

maisumakun

総合スコア146018

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

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

退会済みユーザー

退会済みユーザー

2020/10/06 06:21

newアクションに@postを設定することで解決しました。本番環境の方も同じコードで動かせたので、このまま進めたいと思います。ご回答ありがとうございました。助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問