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

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

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

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

Ruby on Rails

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

HTML

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

Q&A

解決済

1回答

350閲覧

DBに保存ができない

hosio

総合スコア47

Ruby

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

Ruby on Rails

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

HTML

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

0グッド

1クリップ

投稿2022/05/23 23:51

前提・実現したいこと

DBに保存したい

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

1ページでデータの一覧と、入力フォームが表示されるようにしています。
index.etml.erb上では保存を行えます。
空データを保存した場合にエラーが出力される用のnew.etml.erb上でデータを入力すると保存が行えません。

該当のソースコード

books_controller.rb

1 def new 2 @books=Book.new 3 end 4 5 def create 6 @book=Book.new(title: params[:title],body: params[:body]) 7 if @book.save 8 flash[:notice]="Book was successfully created." 9 redirect_to book_path(@book.id) 10 else 11 @books=Book.all 12 render :new 13 end 14 end 15 16 def index 17 @books=Book.all 18 end

index.html.erb

1<html> 2 <head> 3 <meta charset="UTF-8"> 4 <link rel="stylesheet" href="books.scss"> 5 <title>index</title> 6 </head> 7 8 <body> 9 <% if flash[:notice] %> 10 <div class="flash-message"><p> <%= notice%> </p></div> 11 <% end %> 12 13 <h1>Books</h1> 14 <table> 15 <thead> 16 <tr> 17 <th>Title</th> 18 <th>Body</th> 19 <th colspan="3"></th> 20 </tr> 21 </thead> 22 23 <tbody> 24 <% @books.each do |book| %> 25 <tr> 26 <td><%= book.title %></td> 27 <td><%= book.body %></td> 28 <td><%= link_to "Show",book_path(book.id),class:"link" %></td> 29 <td><%= link_to "Edit",edit_book_path(book.id),class:"link" %></td> 30 <td><%= link_to "Destroy",destroy_list_path(@books.ids), method: :delete, data: {confirm: "削除しますか?"},class:"link" %></td> 31 </tr> 32 <% end %> 33 </tbody> 34 </table> 35 36 <h2>New book</h2> 37 38 <%= form_with model: @book, url:books_path, method: :post do |f| %> 39 <div class="field"> 40 <%= f.label :title %> 41 <%= f.text_field :title %> 42 </div> 43 <div class="field"> 44 <%= f.label :body %> 45 <%= f.text_area :body %> 46 </div> 47 <div class="actions"> 48 <%= f.submit "Create Book" %> 49 </div> 50 <% end %> 51 52 </body> 53</html>

new.html.erb

1<html> 2 <head> 3 <meta charset="UTF-8"> 4 <link rel="stylesheet" href="books.scss"> 5 <title>new</title> 6 </head> 7 8 <body> 9 <% if flash[:notice] %> 10 <div class="flash-message"><p> <%= notice%> </p></div> 11 <% end %> 12 13 <h1>Books</h1> 14 <table> 15 <thead> 16 <tr> 17 <th>Title</th> 18 <th>Body</th> 19 <th colspan="3"></th> 20 </tr> 21 </thead> 22 23 <tbody> 24 <% @books.each do |book| %> 25 <tr> 26 <td><%= book.title %></td> 27 <td><%= book.body %></td> 28 <td><%= link_to "Show",book_path(book.id),class:"link"%></td> 29 <td><%= link_to "Edit",edit_book_path(book.id),class:"link" %></td> 30 <td><%= link_to 'Destroy',book_path(book.id), method: :delete,class:"link" %></td> 31 </tr> 32 <% end %> 33 </tbody> 34 </table> 35 36 <h2>New book</h2> 37 <div class="error-message"> 38 <% if @book.errors.any? %> 39 <div class="error-title"><%= @book.errors.count %> errors prohibited this book from being saved:</div> 40 <ul> 41 <div class="error-list"> 42 <% @book.errors.full_messages.each do |message| %> 43 <li><%= message %></li> 44 <% end %> 45 </div> 46 </ul> 47 <% end %> 48 </div> 49 50 <%= form_with model: @book, url:books_path, method: :post do |f| %> 51 <div class="field"> 52 <%= f.label :title %> 53 <%= f.text_field :title %> 54 </div> 55 <div class="field"> 56 <%= f.label :body %> 57 <%= f.text_area :body %> 58 </div> 59 <div class="actions"> 60 <%= f.submit "Create Book" %> 61 </div> 62 <% end %> 63 64 </body> 65</html>

どなたか解決お願いします。

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

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

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

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

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

maisumakun

2022/05/24 00:19

> 保存が行えません。 どこでどのように失敗するのか、具体的に書いていただけないでしょうか。
hosio

2022/05/24 00:49

やりたい事 index.html.erbのform_withの所で、データの空入力を実行すると、new.html.erbへ飛び データがないですよとエラーが出るようにしています。 失敗する事 new.etml.erbのform_withの所で、:title,:bodyに文字を入力し送信を行なってもindex.html.erbのように保存が行えず、new.html.erbのページにリダイレクト?されます。 説明が拙く申し訳ありません。
退会済みユーザー

退会済みユーザー

2022/05/24 01:12

books_pathというルーティングは合っていますか?
退会済みユーザー

退会済みユーザー

2022/05/24 01:13

form_withだったらmodelだけで、urlとmethodなくても動いた気がします
hosio

2022/05/24 04:50

index.html.erb上では、問題なくデータの保存ができており new.html.erbでも全く同じルーティングが書かれているのでルーティングは問題なさそうです。 試しにurlとmethodを消してみましたが動作は変わりませんでした。
guest

回答1

0

ベストアンサー

修正点❶
create アクションでのパラメータの指定方法が誤っています。

rb

1params[:title] 2params[:body]

ではなく

rb

1params[:book][:title] 2params[:book][:body]

です。

--

修正点❷
index アクションのときに [:book] 無しで動いているのは、@book を指定していないためです。
ですので、index に以下の修正を加えてください。

diff

1 def index 2 @books=Book.all 3+ @book=Book.new 4 end

--

おまけ
ここから下は「リファクタリング」の話なので、余裕があればやってみる、くらいの感覚でokです。

「index.html.erb」と「new.html.erb」がほぼ同じコードなので、ひとつにまとめます。

まずは render を index に変えます。

diff

1 def create 2 ... 3 else 4 @books=Book.all 5- render :new 6+ # エラー時も index.html.erb を使う 7+ render :index 8 end 9 end

次に、「index.html.erb」にエラーメッセージ表示機能を加えます。
if @book.errors.any? の位置に注意してください。

diff

1### index.html.erb 2 <h2>New book</h2> 3+ <%# エラー用の div 全体を if で囲うことで、エラーが無い時のレイアウト崩れを防ぐ。 %> 4+ <% if @book.errors.any? %> 5+ <div class="error-message"> 6+ (@book.errors.full_messages を表示) 7+ </div> 8+ <% end %> 9 <%= form_with ... %>

最後に、不要となった new アクションと view を削除します。

diff

1### books_controller.rb 2- def new 3- @books=Book.new 4- end 5 6### new.html.erb 7- (ファイルごと削除)

以上です。

投稿2022/05/24 23:10

shinoharat

総合スコア1676

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

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

hosio

2022/05/24 23:30

回答の通りにコードを書き換えたら解決しました! おまけの部分も実施した所、コードが簡潔になりみやすくなりました。 丁寧な回答ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問