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

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

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

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

Ruby on Rails 6

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

3回答

1074閲覧

【Ruby on Rails】form_withを使って作成した入力フォームの内容をDBに保存したい

shachihoko

総合スコア1

Ruby

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

Ruby on Rails 6

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2021/08/30 05:36

作成した入力フォーム(form_with)の入力内容をDB(MySQL)に保存したい

Ruby on Railsで入力フォームを作成しています。Viewの部分は何も問題なく動くのですが、なぜかデータベースに保存されません。解決策をご教授いただければ幸いです。

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

エラーメッセージはありません。

該当のソースコード

book.html.erb(View)

<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>予約システム</title> </head> <body> <h1>予約フォーム</h1> <%= form_with model: @reservation do |f| %> <ul class = "foo"> <li> <%= f.label :name, '氏名'%> <%= f.text_field :name, size:"40", autocomplete: 'off' %> </li> <li> <%= f.label :club, '部活名' %> <%= f.text_field :club, size:"40"%> </li> <li> <%= f.label :email, '連絡先' %> <%= f.text_field :email, size:"40", autocomplete: 'off' %> </li> <li> <%= f.label :leader, '部長名' %> <%= f.text_field :leader, size:"50"%> </li> <li> <%= f.label :adviser, '顧問名' %> <%= f.text_field :adviser, size:"50"%> </li> <li> <%= f.label :place, '場所' %> <%= f.text_field :place %> </li> <li> <%= f.label :time, '活動日時' %> <%= f.text_field :time %> </li> <li> <%= f.label :member, '活動人数' %> <%= f.text_field :member %> </li> <li> <%= f.label :purpose, '使用用途' %> <%= f.text_field :purpose, size:"80" %> </li> </ul> <div class="button_wrapper"> <a class="btn", href="/book_preview"><%= f.submit "プレビュー画面へ"%></a> </div> <% end %> </body> </html>

home_controller.rb

class HomeController < ApplicationController def book @reservations = Reservation.all end def new @reservation = Reservation.new end def create # @reservation = Reservation.new(content: reservation_params[:content]) @reservation = Reservation.new(reservation_params) #Reservation.create(reservation_params) if @reservation.save flash[:success] = "保存できました" # render '/book_preview' redirect_to @reservation else flash[:danger] = "保存ができていません" render :new end #redirect_to("/book_preview") end private #ストロングパラメータ def reservation_params params.requie(:reservation).permit(:name) end def edit @reservation = Reservation.find(params[:id]) end def update Reservation.find(params[:id]).update(reservation_params) end def book_preview end end

route.rb

Rails.application.routes.draw do get "/" => "home#book" post "create" => "home#create" get "book_preview" => "home#book_preview" # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html end

book_preview.html.erb(この問題には関係がないかもしれませんんが一応載せておきます)

<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>予約システム</title> </head> <body> <h1>プレビュー画面</h1> <table border="1"> <tr> <td>氏名</td><td></td> </tr> <tr> <td>部活名</td><td></td> </tr> <tr> <td>連絡先</td><td></td> </tr> <tr> <td>部長名</td><td></td> </tr> <tr> <td>顧問名</td><td></td> </tr> <tr> <td>場所</td><td></td> </tr> <tr> <td>活動日時</td><td></td> </tr> <tr> <td>活動人数</td><td></td> </tr> <tr> <td>使用用途</td><td></td> </tr> <div class="button_wrapper"> <a href="/" class="btn">予約フォームに戻る</a> <a class="btn">予約を確定する</a> </div> </body>

試したこと

form_withとデータベースで検索して出てきたサイトを片っ端から参考にコードをいじったのですが、結果は変わらずでした。サイトに書かれていることを理解しているかと言われれば完璧に理解はできていないです。個人的にroute.rbが怪しいかなと思っています。

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

MacOS Big Sur 11.4
MySQL Ver 8.0.23
Ruby on Rails Ver 6.1.3.2
Ruby Ver 2.7.2p137

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

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

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

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

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

winterboum

2021/08/30 08:14

model Reservation の codeを載せて
shachihoko

2021/08/30 09:49

home_controller.rbのdef book_preview end以外のアクションのコードがReservation のコードのつもりでした。
winterboum

2021/08/30 10:49

app/models/reservation.rb
shachihoko

2021/08/30 11:06

すみません、ありがとうございます。 reservation.rb class Reservation < ApplicationRecord end
winterboum

2021/08/30 11:21

app/controllers/reservations_controller.rb は?
shachihoko

2021/08/30 11:30

home_controller.rb がその reservations_controller.rb です。
winterboum

2021/08/30 12:06

はて、、、、 質問するにあたってファイル名を変えたりしてます?
shachihoko

2021/08/30 13:12

いえ、ファイル名は変えていないです。
guest

回答3

0

tonakai_route さんが書いているように、標準的なRailsの構成になっていないので、「動き」の読みが困難なのです。

html.erb が <!DOCTYPE html> で始まっているとか
HomeController で Reservation を create しているつもりである とか
form_with model: @reservation なのに、ReservationController に行かずに HomeController で受ける つもりである とか
なのに routes.rb ではそれを実現するらしき記述がないとか

修離破 と言います。独自のスタイルを作る前にまず標準のスタイルで作り直してはどうでしょうか。初心者でしたら特に。

投稿2021/08/31 03:01

winterboum

総合スコア23416

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

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

shachihoko

2021/08/31 04:59

確かにそうですよね。 何度もすみません、標準なスタイルというのはどういうもののことを指しているのでしょうか。サイトに載っているスタイルの通りにということでしょうか。
winterboum

2021/08/31 06:47

モデル名、その定義fileの置き場所と名前、テーブル名の関係 モデル名とコントローラー名、置き場所とfile名の関係 標準的な controllerのアクションとviewのfile名の関係とその置き場所の関係 アクションを定義する rotes.rb を「工夫」しないで、というのが標準です。 何で Rrails 勉強してますか? 取り敢えずはそのとおりに。
shachihoko

2021/08/31 11:48

主にProgateで勉強しています。
guest

0

自分の知ってるrailsとはまた違った書き方なので、あくまで自分のレベルからコメントします。

1, routerの書き方
resourcesで書きます
https://railsguides.jp/routing.html#web%E4%B8%8A%E3%81%AE%E3%83%AA%E3%82%BD%E3%83%BC%E3%82%B9
基本のアクションを手軽にルーティングしてくれるからです。

2, ファイルの置場所
resourceに書いたルーティングのフォルダをコントローラーやビューファイル、モデルの作成をコマンドで行ったあと、new.html.erbのファイル名を上記ディレクトリに置き、そこにフォームの記述をします。
そうすることにより、
newアクション→new.html.erbのviewファイル→POSTメソッド→createアクションと流れます。
おそらくbookアクションはルーティングされてますがnewその他アクションがルーティングされてないと思います。

ルーティングが怪しいと思うなら、ターミナルでrails routesと打ってみてください。https://qiita.com/morikuma709/items/2d948feab31f9cf6b4df

投稿2021/08/30 14:24

編集2021/08/30 14:28
tonakai_route

総合スコア28

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

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

0

自分も初心者レベルですが、プライベートメソッドの部分でnameしか表記していないので、保存したいすべての表記をしなければデータを受け渡しできていないことで、保存できていないのではないかと思います。あとparams.requireのつずりですがrが抜けています。

private

1 def reservation_params 2 params.require(:reservation).permit(:name,:club,:email,:leader,:adviser,:place,:time,:member,:purpose) 3 end 4コード

投稿2021/08/30 12:18

KAZU0508

総合スコア2

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

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

winterboum

2021/08/30 12:44

「保存したいすべての表記をしなければデータを受け渡しできていないことで、保存できていないのではないかと思います」 私もそこを疑ったのですが、modelには validation が一つもないので、違うかな、、、と
KAZU0508

2021/08/30 12:45

あとparams.requireのつずりですがrが抜けています。
shachihoko

2021/08/30 13:28

えっと、最初保存されるかのテストでnameのみを表記しているのですが、それが駄目だったのでしょうか? rが抜けている指摘ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問