🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Cloud9

Cloud9は、クラウドからのプログラミングが可能になるWebサービス。IDEとしての機能が搭載されており、GitHubやHerokuなど他ツールとの連携も可能です。ブラウザ上で動くため、デバイスに関係なく開発環境を準備できます。

Ruby on Rails 6

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

Q&A

解決済

1回答

4384閲覧

rails エラーメッセージが表示されない

yukitodesu3

総合スコア10

Cloud9

Cloud9は、クラウドからのプログラミングが可能になるWebサービス。IDEとしての機能が搭載されており、GitHubやHerokuなど他ツールとの連携も可能です。ブラウザ上で動くため、デバイスに関係なく開発環境を準備できます。

Ruby on Rails 6

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

0グッド

0クリップ

投稿2021/03/11 14:32

webアプリケーションを作っているのですが、バリデーション機能をつけ、エラーメッセージを表示させるコードを書いたのですがエラー文が出て、うまくページに表示されません。ページはエラー起きた時の方に移動されているのでバリデーション自体はうまく行っていると思います。

イメージ説明

ページを開くとこのようなエラーが出ます。
railsを始めたばかりで、わからないことも多いですが、アドバイスいただけると嬉しいです。

index.html.erb

<div class="container"> <% if @book.errors.any? %> <div id="error_explanation" class="alert alert-danger"> <ul> <% @book.errors.full_messages.each do |message| %> <li><%= message %></li> <% end %> </ul> </div> <% end %> <div class="row mt-4"> <div class="col-3"> <div class="col"> <h1>User info</h1> <table class="table"> <thead> <tr> <th><%= attachment_image_tag(@user, :profile_image, :fill, 100, 100, fallback: "no_image.jpg") %></th> <th></th> </tr> </thead> <tbody> <tr> <td>name</td> <td><%= @user.name %></td> </tr> <tr> <td>introduction</td> <td><%= @user.introduction %></td> </tr> </tbody> </table> </div> <div class="col"> <div class="profile-edit text-center"> <%= link_to edit_user_path(@user), method: :get do %> <p class="border border-dark rounded" style="color:black;"><i class="far fa-user"></i></p> <% end %> </div> </div> <div class="col"> <h1>New book</h1> <div class="user-show-form"> <%= form_for (@book_new) do |f| %> <div class="show-form-title">Title</div> <div class="show-form-title2"><%= f.text_field :title %></div> <div class="show-form-opinion">Opinion</div> <div class="show-form-opinion2"><%= f.text_area :body %></div> <div class="show-form-submit"><%= f.submit 'Create Book' %></div> <% end %> </div> </div> </div> <div class="col-8"> <div class="user-index-title"> <h1>users</h1> </div> <table class="table"> <thead> <tr> <th>image</th> <th>name</th> <th></th> </tr> </thead> <% @books.each do |book| %> <tbody> <td><%= attachment_image_tag book.user, :profile_image, :fill, 100, 100, fallback: "no_image.jpg" %></td> <td> <%= link_to book_path(book.id), method: :get do %> <%= book.title %> <% end %> </td> <td> <%= book.body %> </td> </tbody> <% end %> </table> </div> </div> </div>

book.rb

class Book < ApplicationRecord belongs_to :user validates :title, presence: true validates :body, presence: true,length: { maximum: 75 } end

books.contoller.rb

class BooksController < ApplicationController def index @books = Book.all @user = current_user @book_new = Book.new end def show @book = Book.find(params[:id]) @user = User.find(@book.user_id) @book_new = Book.new end def new end def create @book = Book.new(list_params) @book.user_id = current_user.id if @book.save redirect_to book_path(@book.id) else redirect_to books_path end end def delete @book = Book.find(params[:id]) if @book.destroy redirect_to books_index_path end end def edit end private def list_params params.require(:book).permit(:title, :body,:user_id) end end

schema.rb

# This file is auto-generated from the current state of the database. Instead # of editing this file, please use the migrations feature of Active Record to # incrementally modify your database, and then regenerate this schema definition. # # Note that this schema.rb definition is the authoritative source for your # database schema. If you need to create the application database on another # system, you should be using db:schema:load, not running all the migrations # from scratch. The latter is a flawed and unsustainable approach (the more migrations # you'll amass, the slower it'll run and the greater likelihood for issues). # # It's strongly recommended that you check this file into your version control system. ActiveRecord::Schema.define(version: 2021_03_06_142649) do create_table "books", force: :cascade do |t| t.string "title" t.string "body" t.integer "user_id" t.datetime "created_at", null: false t.datetime "updated_at", null: false end create_table "users", force: :cascade do |t| t.string "email", default: "", null: false t.string "encrypted_password", default: "", null: false t.string "reset_password_token" t.datetime "reset_password_sent_at" t.datetime "remember_created_at" t.string "name" t.string "introduction" t.string "profile_image_id" t.datetime "created_at", null: false t.datetime "updated_at", null: false t.index ["email"], name: "index_users_on_email", unique: true t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true end end

試したこと
・コードの確認
・エラー文の確認

お忙しいとは思いますが「、よろしくお願いします

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

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

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

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

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

guest

回答1

0

ベストアンサー

def index で @book が定義されていません。
def create の @book は redirect_to すると index から参照できません。
そのため、@book が nil になり、それに errors メソッドを呼んでいるので undefined method と言われています。

エラーを表示するオーソドックスな方法は def create で render することです。

ruby

1def new 2 # 下記の new.html.erb で参照するため初期化します 3 @book = Book.new 4end 5 6def create 7 if @book.save 8 ... 9 else 10 # @book には保存に失敗した(@book.errors.any? == true)が入ってます 11 render "new" 12 end 13end

new.html.erb

erb

1<% if @book.errors.any? %> 2 <div id="error_explanation" class="alert alert-danger"> 3 <ul> 4 <% @book.errors.full_messages.each do |message| %> 5 <li><%= message %></li> 6 <% end %> 7 </ul> 8 </div> 9<% end %>

投稿2021/03/11 15:47

neko_daisuki

総合スコア2090

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

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

yukitodesu3

2021/03/11 15:48

回答ありがとうございます。 無事解決することができました。 newファイルを使うんですね。 勉強になります。
neko_daisuki

2021/03/11 15:55

@book のエラーを表示するviewであれば任意のファイルで構いません。 学習の初期の段階ではrails の scaffold で生成されるコードを読み解くとはかどると思います。
yukitodesu3

2021/03/12 10:13

なるほど。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問