###起こっている問題
ローカル環境で記事の新規投稿画面(/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で共通しています。
そもそもデータはちゃんと想定通り存在してるのでしょうか?
「ローカル環境でのみ」とのことですが、それ以外の動作している環境とデータをあわせた場合はどうでしょうか
ご意見いただきありがとうございます。「想定通り存在しているデータ」とは何のことですか?データベース内のデータのことでしょうか。
だとしたら、同じテーブルとカラムは存在しています。
いえ、ですから
「ローカル環境"でのみ"」と書かれてると普通は「他にも動作している環境がある」と感じるわけです。
「それならその別の環境と同じデータでローカル環境動かしたらどうなる?」という確認です。何かおかしいこと聞いてますか?
本当にごめんなさい、データというのが本当にわかりません。ソースコードや設定のことでしょうか?
ローカルの他にはすでにデプロイしたAWS上の本番環境があり、そちらではNginxとpumaを使って動かしています。ローカルではrails sしてpumaだけで動かしている状態ですから、合わせるとしたらローカルでもNginxを使うということが考えられます。
そういうことを仰っているのでしょうか?
(何がわかってないかもわかってない状態で、苛立たせてしまい本当に申し訳ございません)
>すでにデプロイしたAWS上の本番環境
はい、その環境のデータ
です。
データとはデータベースのデータに他なりません。
問題切り分けを行う必要があります。
コードが同じならデータが違うから起きたのか、設定なのか 一つずつ見に行かなければなりません。
が、質問者さんは始めからローカル環境のことしか触れられていないので、こちらも答えようがない状態です。
「~のみ起きる」のであれば、起きる環境と起きない環境の違いを見ていくしかありません。データは環境より合わせやすいので、まずはデータを合わせて現象再現するか確認します。
もちろん「コードは全く同じ」前提ですけどね。
ひとまず、他の環境についても質問本文に追記いただけますか?
※ただ、全ての環境情報があったとしても、コードやデータまで提示されないと他者には再現できない=アドバイスしようが難しい
状態であることはご理解ください
質問に追記させていただきました。
質問する上で必要な情報がわからず、ご迷惑をおかけして申し訳ありません。
他に必要な情報があったらご指摘いただけますと幸いです。
「Extracted source」以前にエラーメッセージ本体が出ているかと思いますが、それはどのような内容でしょうか?
Showing /Users/nawaryoga/filma/app/views/posts/new.html.erb where line #5 raised:
undefined method `errors' for nil:NilClass
このような内容です。
「他にすでに動いている本番環境」でnewしても「エラーにはならず正常に動作する」のでしょうか?
(詳細なエラーメッセージが出ずに「エラーである」ことを伝えるだけの画面にする、ということは本番環境ではよく行われます)
本番環境では全く問題ありません。
ページは開けますし、何も入力せず『投稿する』を押下しても想定どおりバリデーションエラーのメッセージが表示されます。
ApplicationControllerはどのようになっていますか?
(このコードでは、むしろ「本番で動いている」ほうが理解できない状況です)
class ApplicationController < ActionController::Base
end
こうなっています。
どのようなgemを入れていますか?
回答1件
あなたの回答
tips
プレビュー