大変初歩的なご質問なのですが、ググれどググれど解決につなげられずご質問・教授をお願い致します。
発生している問題・エラーメッセージ
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] 7 8 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
回答1件
あなたの回答
tips
プレビュー