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

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

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

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

Ruby on Rails

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Q&A

解決済

1回答

576閲覧

Ruby(Ruby on Rails)でバリテーションによるエラーメッセージを画面に表示しようとしているのですが、エラー画面が出てしまい先に進みません。

TAKANORI-1125

総合スコア2

Ruby

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

Ruby on Rails

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

0グッド

0クリップ

投稿2021/12/17 13:43

編集2021/12/19 06:44

前提・実現したいこと

バリテーションを正常に作動させ、エラーメッセージを出したいです。

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

Ruby(Ruby on Rails)でバリテーションによるエラーメッセージを画面に表示しようとしているのですが、エラー画面が出てしまい先に進みません。 エラー画面には、      undefined method `errors' for nil:NilClass  と表示され、エラー該当部分は     <% if @snack.errors.any? %> になります。

該当のソースコード

snackscontrollerrb

1class SnacksController < ApplicationController 2                                     (略) 3 def new 4 @snack = Snack.new 5 end 6 def create 7 @snack = Snack.new(snack_params) 8 if @snack.save 9 flash[:notice] = "Snack was successfully created." 10 redirect_to snack_path(@snack.id) 11 else 12 render :index 13 end 14 end 15 (略) 16 private 17 def snack_params 18 params.require(:snack).permit(:title, :category, :body) 19 end 20end

indexhtmlerb

1      (略) 2<h4>New Snack</h4> 3 4<% if @snack.errors.any? %> 5 <%= @snack.errors.count %>errors prohibited this snack from being save: 6 <% @snack.errors.full_messages.each do |message| %> 7 <%= message %> 8 <% end %> 9<% end %> 10 11<%= form_with model: @snack, local: true do |f| %> 12 <h5>商品名</h5> 13 <%= f.text_field :title %> 14 <h5>カテゴリー</h5> 15 <%= f.text_field :category %> 16 <h5>商品説明</h5> 17 <%= f.text_area :body %> 18 <br><%= f.submit "Create Snack" %></br> 19<% end %>

routesrb

1Rails.application.routes.draw do 2 3 root :to => "homes#top" 4 resources :snacks 5end

試したこと

コントローラーアクションに問題があると思い、変数定義など色々試しましたが、解らず、また、周囲に聞ける人がおらず、質問させていただきました。

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

Rails バージョン5.2.6 ruby 2.6.8
作成したモデルは、Snack テーブル snacks カラムは, title category body になります。
また、新規投稿フォームと投稿一覧画面をindex内に記載しています。

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

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

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

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

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

MasaSakano

2021/12/18 21:17

`routes.rb` のSnack関係部分を記載してくださいますか。Rails conventionにしたがっているのであれば、indexがControllerにないようですから、routes確認の必要があります。
TAKANORI-1125

2021/12/19 06:52

お忙しい中、ご回答ありがとうございます。 ルーティングは、URLを自動設定してくれる resources を使用しています。 コントローラーアクションでindexアクションを確認しましたが、特にスペルミスがなく、原因が判らず、詰まっています。
MasaSakano

2021/12/19 11:45

編集後の回答を読みました。routesに関して明快な説明ありがとうございます。 このエラーは、具体的にどのパスに(ブラウザで)アクセスした時に起きていますか? /snacks ですか? 何か別のパスですか? indexアクションを確認したということですが、snacks_controller.rb の中の index メソッドも見せてください(お手元のファイルにはあるけれど、ここに載せていないだけですよね?)。
TAKANORI-1125

2021/12/19 12:07

お忙しい中、ご回答いただきありがとうございました。  以下の通り記述し、実施したところ、エラー画面が出なくなりました。 ・現在のsnackコントローラーのnewアクションに書かれている内容@snack = Snack.newをindexアクシ   ョンに追記する
guest

回答1

0

自己解決

エラーの原因は以下の通りでした。

・index.html.erbの@snackが、nil(値が入っていない状態)になっています。
・理由はsnackコントローラーでindexアクションを定義している部分で、@snacksは定義していますが、@snackは定義していないためです。

解決方法
・現在のsnackコントローラーのnewアクションに書かれている内容@snack = Snack.newをindexアクシ   ョンに追記する

これで、エラー画面が出なくなりました。

投稿2021/12/19 12:11

TAKANORI-1125

総合スコア2

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

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

MasaSakano

2021/12/19 13:11

`index.html.erb` で (`@snacks`ではなく) `@snack`を使う状況は、Railsのconventionにそっていないので、実はお勧めできません。そもそも表記の `index.html.erb` が、通常の `new.html.erb` の内容に見えます。 RailsこそCoCの生みの親ですし、Convertionにそっていない特殊な方針は、なるべく開発早期の間に修正なさる方が後々幸せかとは思います……。DHH(Railsの父)の話を聞いていると、CoCの原則が骨の髄から徹底していますね。 当座解決できた様子でよかったですが!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問