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

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

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

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

Ruby on Rails

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

バリデーション

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

Q&A

解決済

1回答

1205閲覧

railsのバリデーション

ttt452

総合スコア4

Ruby

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

Ruby on Rails

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

バリデーション

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

0グッド

0クリップ

投稿2021/04/17 09:21

編集2021/04/17 10:31

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
(例)ruby on railsで本の感想を追加できるようなシステムを作っています。
バリデーションの機能を実装中に以下のエラーメッセージが発生しました。

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

イメージ説明

該当のソースコード

routes

1 2Rails.application.routes.draw do 3 # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html 4 get '' => 'homes#top' 5 get 'books' => 'books#index' 6 post 'books' => 'books#create' 7 get 'books/:id' => 'books#show', as: 'book' 8 get 'books/:id/edit' => 'books#edit', as: 'edit_book' 9 10 patch 'books/:id' => 'books#update', as: 'update_book' 11 get 'books/:id/update' => 'books#update' 12 delete 'books/:id' => 'books#destroy', as: 'destroy_book' 13 14end

modelBook

1class Book < ApplicationRecord 2 validates :title, presence: true 3 validates :body, presence: true 4end

booksController

1class BooksController < ApplicationController 2 3 def new 4 5 end 6 7 def index 8 @books = Book.all 9 @book = Book.new 10 end 11 12 def show 13 @book = Book.find(params[:id]) 14 end 15 16 def edit 17 @book = Book.find(params[:id]) 18 end 19 20 21 22 def destroy 23 book = Book.find(params[:id]) 24 book.destroy 25 flash[:success] = "Book was successfully destroyed." 26 redirect_to books_path 27 end 28 29 30 31 def create 32 33 34 35 book = Book.new(book_params) 36 if book.save 37 flash[:success] = "Book was successfully created." 38 redirect_to "/books/#{book.id}" 39 else 40 # flash.now[:danger] = "Failed to save." 41 #render "/books" 42 render :index 43 end 44 end 45 46 47 48 49 50 def update 51 book = Book.find(params[:id]) 52 53 54 if book.update(book_params) 55 flash[:success] = "Book was successfully updated." 56 redirect_to "/books/#{book.id}" 57 else 58 flash.now[:danger] = "Failed to update." 59 render "/books" 60 end 61 end 62 63 64 65 private 66 67 def book_params 68 params.require(:book).permit(:title, :body) 69 end 70 71end 72

index

1 2 3 4 <div class="notifications"> 5 <% flash.each do |message_type, message| %> 6 <%= message %> 7 <% end %> 8 </div> 9 10 11 <h1>Books</h1> 12 13 <!-- 一覧表示 --> 14 <table style="table-layout: fixed;"> 15 16 <tr> 17 <th>Title</th> 18 <th>Body</th> 19 <th colspan="3"></th> 20 </tr> 21 22 23 <% @books.each do |book| %> 24 <tr> 25 <td><%= book.title %></td> 26 <td><%= book.body %></td> 27 <!--<td><a class="show" href="/books/">Show</a></td>--> 28 <td><%= link_to "Show", "/books/#{book.id}" %></td> 29 <td><%= link_to "Edit", "/books/#{book.id}/edit" %></td> 30 <td><%= link_to "Destroy", destroy_book_path(book.id), method: :delete, "data-confirm" => "Are you sure?" %></td> 31 </tr> 32 <% end %> 33 </table> 34 35 36 <% if @book.errors.any? %> 37 <%= @book.errors.count %>件のエラーが発生しました 38 <% @book.errors.full_messages.each do |message| %> 39 <%= message %> 40 <% end %> 41 <% end %> 42 43 <!-- 新規投稿 --> 44 <%= form_with model:@book, url:'/books', local:true do |f| %> 45 <div class="new-book"> 46 <h2>New book</h2> 47 <p>Title</p> 48 <%= f.text_field :title %> 49 <p>Body</p> 50 <%= f.text_area :body %> 51 <div> 52 <%= f.submit 'Create Book' %> 53 </div> 54 </div> 55 <% end %> 56

試したこと

プログラムを目で追ってみましたが、わかりません。
@booksがnilになっていてエラーをはいてると思うのですが、参考にさせていただいた他の方は出ていないように思います。

参考資料

https://qiita.com/clbcl226/items/af336ff06bfba4dacfd9

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

AWS
windows
rails -v 5.2.5

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

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

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

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

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

maisumakun

2021/04/17 09:40

エラーメッセージ中に「23行目」と書かれていますが、どこが23行目かはわかりますか?
ttt452

2021/04/17 10:33

説明なく、申し訳ありません。 indexの23行目 <% @books.each do |book| %> です!
guest

回答1

0

ベストアンサー

render :indexする以上は、@booksが必要です。

参考にさせていただいた他の方は出ていないように思います。

通常はindexに新規作成の画面を一緒につけることはない(し、ましてやindexつきのビューでバリデーション失敗時の再描画を行うこともない)ので問題となりません。

投稿2021/04/17 10:40

編集2021/04/17 10:45
maisumakun

総合スコア145121

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

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

ttt452

2021/04/17 11:15

回答ありがとうございます。 createアクションで、 @books = Book.all を記述すればいいのでしょうか? 試してみたところ今度は、index.htmlで、 38行目:<% if @book.errors.any? %> エラー:undefined method `errors' for nil:NilClass というようなエラーが出てしまいました。 が、解決しました。一個目のエラーと同じですね。 @bookと@booksをアクションで定義してあげたらいけました! routingから呼び出されるindexアクションと createのrenderから呼び出されるindexアクションは生成のされかたが違うから、ちゃんと定義してあげないといけないってことですよね!? (エラーである空データも扱うため)
maisumakun

2021/04/17 11:18

> routingから呼び出されるindexアクションと createのrenderから呼び出されるindexアクションは生成のされかたが違うから、ちゃんと定義してあげないといけないってことですよね!? まあ、そうではあるのですが、再入力の際に一覧リストは余計でしかないので、専用の画面を作ったほうが適切かとは思います(編集画面とフォームを共通化すればそう手間にはなりません)。
ttt452

2021/04/18 23:08

なるほど。。。次回からはそこのところ意識してやってみます! 今回は課題としてnewアクション封印されているので。。。 丁寧な説明、感謝いたします!
maisumakun

2021/04/19 00:06

> 今回は課題としてnewアクション封印されているので。。。 課題の設定そのものが良くない感じはしますね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問