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

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

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

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

Ruby on Rails

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

バリデーション

Validationとは特定の入力データが、求められた条件に当てまっているかをチェックするために使われます。

Q&A

解決済

1回答

5813閲覧

undefined method `errors' for nil:NilClassエラーから救われたい

koh-s

総合スコア9

Ruby

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

Ruby on Rails

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

バリデーション

Validationとは特定の入力データが、求められた条件に当てまっているかをチェックするために使われます。

0グッド

0クリップ

投稿2020/04/01 12:57

大変初歩的なご質問なのですが、ググれどググれど解決につなげられずご質問・教授をお願い致します。

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

undefined method `errors' for nil:NilClass

イメージ説明

前提・実現したいこと

【実現したいこと】
バリデーションを組み込み、renderでindexアクションからアコーディオン(_new_base)で追加フォームを表示させて間違った入力ならエラーメッセージを表示させたい。

画像のエラーを改善したい。
modelがnilな状態なことは確認できているのですが、具体的にどの様に改善に向けていけば良いのかわからない状況です。

下記をバリデーションにかけられようにして拠点一覧にエラーなく遷移させたい。

ruby

1validates :base_number, :numericality => { :greater_than_or_equal_to => 0 } 2validates :base_name, presence: true

試したこと

【試したこと】

・エラーメッセージについて調べました。
https://qiita.com/ryuuuuuuuuuu/items/1a1e53d062bff774d88a

undefined method `errors' for nil:NilClassエラーについて調べました
https://teratail.com/questions/3803
https://stackoverflow.com/questions/18136632/undefined-method-errors-for-nilnilclass-when-calling-on-errors-method

今回と同じ事象がないか調べましたが、合致する記事を見つけられずご質問させていただきました。
大変お忙しい中と存じますが、何卒ご指導ご鞭撻の程よろしくお願いいたします。

ruby

1views/shared/_error_messages_bases.html.erb 2 3<% if model.errors.any? %> 4<div id="error_explanation"> 5 <div class="alert alert-danger"> 6 入力エラーが<%= model.errors.count %>件ありました。 7 </div> 8 <ul> 9 <% model.errors.full_messages.each do |msg| %> 10 <li><%= msg %></li> 11 <% end %> 12 </ul> 13</div> 14<% end %> 15

ruby

1bases.controller.rb 2 3class BasesController < ApplicationController 4 before_action :set_base, only: [:update, :show, :destroy] 5 before_action :logged_in_user, only: [:index, :update, :show, :destroy] 6 before_action :admin_user, only: [:index, :update, :show, :destroy] 78 def index 9 @bases = Base.all.order('id ASC') 10 end 11 12 def new 13 @base = Base.new 14 end 15 16 def create 17 @base = Base.new(base_params) 18 if @base.save 19 flash[:success] = "拠点情報を作成しました。" 20 redirect_to bases_url 21 else 22 flash[:notice] = "拠点情報の作成に失敗しました。" 23 render :index 24 end 25 end 26 27 def show 28 end 29 30 def update 31 if @base.update_attributes(base_params) 32 flash[:success] = "拠点情報を更新しました。" 33 redirect_to bases_url 34 else 35 flash[:danger] = "更新に失敗しました。" 36 render :index 37 end 38 end 39 40 def destroy 41 @base.destroy 42 flash[:success] = "#{@base.base_name}を削除しました" 43 redirect_to bases_url 44 end 45 46 private 47 def set_base 48 @base = Base.find(params[:id]) 49 end 50 51 def base_params 52 params.require(:base).permit(:base_number, :base_name, :base_attendance) 53 end 54end 55

ruby

1index.html.erb 2<% provide(:tittle, "拠点一覧")%> 3<h1>拠点一覧</h1> 4<div> 5 <table class="table table-bordered table-condensed table-hover"> 6 <thead> 7 <tr> 8 <th class="col-md-3"></th> 9 <th class="col-md-2"></th> 10 <th>拠点番号</th> 11 <th>拠点名</th> 12 <th>勤怠種類</th> 13 </tr> 14 </thead> 15 <tbody> 16 <% @bases.each do |base| %> 17 <tr> 18 <td class="col-md-3"> 19 <div class="add_base"> 20 <div id="accordion<%= base.id %>"> 21 <h4 class="panel-title"> 22 <a data-toggle="collapse" data-parent="#accordion<%= base.id %>" href="#collapse<%= base.id %>"> 23 <button class="btn btn-primary btn-lg" type="button">編集</button></a> 24 </h4> 25 </div> 26 </div> 27 </td> 28 <td> 29 <%= link_to "削除", base, method: :delete, 30 data: { confirm: "#{base.base_name}を削除してよろしいですか?" }, 31 class: "btn btn-primary" %> 32 </td> 33 <td><%= base.base_number %></td> 34 <td><%= base.base_name %></td> 35 <td><%= base.base_attendance %></td> 36 </tr> 37 <tr> 38 <td colspan="4"> 39 <div id="collapse<%= base.id %>" class="panel-collapse collapse"> 40 <div class="panel-body"><%= render 'bases/edit_base', {base: base} %></div> 41 </div> 42 </td> 43 </tr> 44 <% end %> 45 </tbody> 46 </table> 47</div> 48 49<div class="add_base"> 50 <div class="panel-group" id="accordion"> 51 <div class="panel panel-default"> 52 <div class="panel-heading"> 53 <h4 class="panel-title"> 54 <a data-toggle="collapse" data-parent="#accordion" href="#collapse"> 55 <button class="btn btn-primary btn-lg" type="button">拠点情報追加</button></a> 56 </h4> 57 </div> 58 <div id="collapse" class="panel-collapse collapse"> 59 <div class="panel-body"><%= render 'bases/new_base' %></div> 60 </div> 61 </div> 62 </div> 63</div>

ruby

1<%= form_with(model: @base, local: true) do |f| %> 2<%= render "shared/error_messages", model: f.object %> 3 <%= f.label :base_number, "拠点番号", class: "label--edit" %> 4 <%= f.number_field :base_number, class: "form-control" %> 5 6 <%= f.label :base_name, "拠点名", class: "label--edit" %> 7 <%= f.text_field :base_name, class:"form-control" %> 8 9 <%= f.label :base_attendance, "拠点種類", class: "label--edit" %> 10 <%= f.text_field :base_attendance, class: "form-control" %> 11 12 <%= f.submit class: "btn btn-primary btn-block" %> 13<% end %>

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

cloud9
RubyonRails

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

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

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

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

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

gouf

2020/04/02 06:56 編集

View 側で「<%= render "shared/error_messages", model: f.object %>」と記述していますが、次のように変更した場合、なにか変化は見られますか? 「<%= render partial: "shared/error_messages", locals: { model: f.object } %>」
koh-s

2020/04/02 11:58

お忙しい中お答えいただき、ありがとうございます。 各アクション内でのインスタンス変数未定義が原因でした。 お騒がせいたしました。
guest

回答1

0

ベストアンサー

create や UPDATE でのエラーではなく、indexを開くときのエラーでしょうか?
どういう時に起きたのか状況を説明しないと間違えた回答が来るかも、です。

<%= form_with(model: @base, local: true) do |f| %>
で @baseを使っていますが、 def index では @baseが用意されていません。
それが原因です。

投稿2020/04/01 16:11

winterboum

総合スコア23329

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

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

koh-s

2020/04/02 11:56

いつもご回答いただきありがとうございます。 状況説明が行き届かず、申し訳ありません。 お答えいただきました内容の通り、追加作成なのでcreateアクション内で失敗したときのrenderの挙動についてとなります。 indexアクションにて@baseの定義とcreateアクション側で@bases定義で解決いたしました。 お答えいただき、誠にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問