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

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

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

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

Q&A

2回答

1583閲覧

redirect_to でエラーメッセージを表示したいです

shuta-a

総合スコア5

Ruby on Rails

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

0グッド

0クリップ

投稿2021/12/15 07:28

バリデーションで空白の場合にエラーメッセージを出したいのですが、render、redirect_to、のどちらが良いでしょうか。

redirect_toの場合 Shutaコントローラ↓

rails

1def create 2 book = Book.new(book_params) 3 if book.save 4 redirect_to shutax_path(book.id) 5 flash[:notice] = "Book was successfully created." 6 else 7 redirect_to index_path 8 end 9end

投稿画面index.html.erb(投稿画面と閲覧画面を同じindexページに載せています)で空白のまま投稿した場合は、またredirect_toでindex.html.erbを表示させるようにしています。しかしredirect_toの仕様上エラーメッセージが表示されないらしいので悩んでおります。

renderの場合 Shutaコントローラ↓

Rails

1def create 2 book = Book.new(book_params) 3 if book.save 4 redirect_to shutax_path(book.id) 5 flash[:notice] = "Book was successfully created." 6 else 7 render "index" 8 end 9end

renderでエラーメッセージを表示させようとすると、index.html.erbに書かれているeachメソッドがエラーを起こしてしまいます。

index.html.erb↓

Rails

1<h1>Books</h1> 2 3<table class="table"> 4 <thead> 5 <tr> 6 <th>Title</th> 7 <th>Body</th> 8 <th colspan="3"></th> 9 </tr> 10 </thead> 11 <tbody> 12 <% @book.each do |book| %> 13 <tr> 14 <td> 15 <%= book.title %> 16 </td> 17 <td> 18 <%= book.body %> 19 </td> 20 <td> 21 <%= link_to "Show", shutax_path(book.id) %> 22 <%= link_to "Edit", edit_shutax_path(book.id) %> 23 <%= link_to "Destroy", destroy_shutax_path(book.id), method: :delete %> 24 </td> 25 </tr> 26 <% end %> 27 </tbody> 28</table> 29 30<h1>New book</h1> 31 32<% if @booker.errors.any? %> 33 <%= @booker.errors.count %> 34 <% @booker.errors.full_messages.each do |message| %> 35 <%= message %> 36 <% end %> 37<% end %> 38 39 40 41<%= form_with model: @book, url:'/books', local:true do |f| %> 42 <h4>Title</h4> 43 <%= f.text_field :title %> 44 <h4>Body</h4> 45 <%= f.text_area :body %> 46 <%= f.submit 'Create Book' %> 47<% end %>

エラーメッセージ↓
イメージ説明

redirect_toを使ってもエラーメッセージを表示することができる方法があるのか、また、NoMethodErrorを解決してrenderを使うのが良いのか、教えてください。よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

redirect では errors.each を使ったエラーメッセージは使えません。
redirectする前にflachに積んでおくのでしょうか

投稿2021/12/15 08:19

winterboum

総合スコア23347

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

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

shuta-a

2021/12/15 08:35

なるほど。flashで表示させることも考えましたが、バリデーションでのエラーメッセージの表示はrenderで行おうと思います。
guest

0

renderでエラーメッセージを表示させようとすると、index.html.erbに書かれているeachメソッドがエラーを起こしてしまいます。

きちんと必要な値を供給しましょう。

投稿2021/12/15 08:35

maisumakun

総合スコア145184

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

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

maisumakun

2021/12/15 08:36

フォームに与えるのとリストを表示するのが同じ@bookでは成立しません。 リストは@booksとしたほうがいいでしょう。
shuta-a

2021/12/15 08:43

はい。errorsメソッドへのインスタンス変数に値が格納されていないのが原因だと推測し、以下のようにelse〜end間にerrorsメソッドに対する@ booker変数をまた定義したのですが、 else @book = Book.all @booker = Book.all render :index end これでもエラーが消えません。 必要な値の供給とはこのことではないのでしょうか。
shuta-a

2021/12/15 08:44

フォームに与えるのとリストを表示するのが同じ@bookでは成立しません。 リストは@booksとしたほうがいいでしょう。 ありがとうございます。試します。
shuta-a

2021/12/15 09:16

厚かましいのは承知でお聞きするのですが、具体的にどの部分を@booksに変えればよいのでしょうか。あれこれ変数の名前を変えたところ、errors.any?の部分でNoMethodErrorが起きてしまいました。
maisumakun

2021/12/15 09:19

上に書いたとおり、「フォームに表示する値」と「ほかの案件のリスト」で値を分けてください。
shuta-a

2021/12/15 09:23

なるほど、閲覧のリストの変数名と投稿フォームの変数名を分かるということですか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問