###起こっている問題
ローカル環境で記事の新規投稿画面(/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
で共通しています。
回答1件
あなたの回答
tips
プレビュー