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

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

ただいまの
回答率

87.49%

フォームで送ったデータがDBに保存されない

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 420

前提・実現したいこと

お世話になります。
ドリンクのメニュー表のようなものにデータを追加したいのですが
newアクションのフォームからデータがDBに保存されないので保存されるようにしたいです。
エラー画面などは出ず、createアクションの投稿完了画面にも遷移されます。
他の質問者さんの回答を参考にしたりしましたが解決できません。
createアクションの定義も書き換えてを試しましたが結果は同じでした。

該当のソースコード

コントローラー(drinks_controller.rb)パターン①
class DrinksController < ApplicationController

  def index
    @drinks = Drink.all
  end

  def new
    @drink = Drink.new
  end

  def create
    Drink.create(drink_params)
  end

  private
  def drink_params
    params.require(:drink).permit(:name, :price, :comment)
  end

end
コントローラー(drinks_controller.rb)パターン②
class DrinksController < ApplicationController

  def index
    @drinks = Drink.all
  end

  def new
    @drink = Drink.new
  end

  def create
    @drink = Drink.create(name: drink_params[:name], price: drink_params[:price], comment: drink_params[:comment])
  end

  private
  def drink_params
    params.require(:drink).permit(:name, :price, :comment)
  end

end
ビューファイル(new.html.haml)
.container-fluid
  = form_with model: @drink, local: true do |f|
    .form-row
      .form-group.col-md-4
        %h5 ドリンク名
        = f.text_field :name, class: 'form-control', placeholder: '例:生ビール'
      .form-group.col-md-4
        %h5 価格
        = f.text_field :price, class: 'form-control', placeholder: '例:〇〇〇円'
      .form-group.col-md-4
        %h5 コメント
        = f.text_field :comment, class: 'form-control', placeholder: '例:乾杯に'
    = f.submit '更新', class: '.btn .btn-primary'

追記

モデル(drink.rb)
class ApplicationRecord < ActiveRecord::Base
  self.abstract_class = true
end
モデル(application.record.rb)
class ApplicationRecord < ActiveRecord::Base
  self.abstract_class = true
end
マイグレーションファイル
class CreateDrinks < ActiveRecord::Migration[6.0]
  def change
    create_table :drinks do |t|
      t.string :name
      t.string :price
      t.string :comment
      t.timestamps
    end
  end
end

試したこと

binding.pryでデータが送られているか確認しました

ターミナル(createアクションでbinding.pry)
######ターミナル(ストロングパラメーターでbinding.pry)
Started POST "/drinks" for ::1 at 2020-07-31 18:26:12 +0900
Processing by DrinksController#create as HTML
  Parameters: {"authenticity_token"=>"VAoRocMTjIxu0Gevi14AEd7xNI/gixhxsQMap7wqgEbquwRvw9RyHkux+4Wocsq1LYhQx2WmRDxcGH1F669pTA==", "drink"=>{"name"=>"熱燗", "price"=>"500円", "comment"=>"冬"}, "commit"=>"更新"}

From: /Users/kyota/projects/oshinagaki2/app/controllers/drinks_controller.rb:13 DrinksController#create:

    11: def create
    12:   Drink.create(drink_params)
 => 13:   binding.pry
    14: end

[1] pry(#<DrinksController>)> params
=> <ActionController::Parameters {"authenticity_token"=>"VAoRocMTjIxu0Gevi14AEd7xNI/gixhxsQMap7wqgEbquwRvw9RyHkux+4Wocsq1LYhQx2WmRDxcGH1F669pTA==", "drink"=><ActionController::Parameters {"name"=>"熱燗", "price"=>"500円", "comment"=>"冬"} permitted: false>, "commit"=>"更新", "controller"=>"drinks", "action"=>"create"} permitted: false>
ストロングパラメーターでbinding.pry
Started POST "/drinks" for ::1 at 2020-07-31 19:23:57 +0900
Processing by DrinksController#create as HTML
  Parameters: {"authenticity_token"=>"uoi7VtJErGi+dAdO1S06n8JWDhu4HhKie0Y+IGc2KmUEOa6Y0oNS+psVm2T2AfA7MS9qUz0zTu+WXVnCMLPDbw==", "drink"=>{"name"=>"熱燗", "price"=>"500円", "comment"=>"冬"}, "commit"=>"更新"}

From: /Users/kyota/projects/oshinagaki2/app/controllers/drinks_controller.rb:18 DrinksController#drink_params:

    16: def drink_params
    17:   params.require(:drink).permit(:name, :price, :comment)
 => 18:   binding.pry
    19: end

[1] pry(#<DrinksController>)> params
=> <ActionController::Parameters {"authenticity_token"=>"uoi7VtJErGi+dAdO1S06n8JWDhu4HhKie0Y+IGc2KmUEOa6Y0oNS+psVm2T2AfA7MS9qUz0zTu+WXVnCMLPDbw==", "drink"=><ActionController::Parameters {"name"=>"熱燗", "price"=>"500円", "comment"=>"冬"} permitted: false>, "commit"=>"更新", "controller"=>"drinks", "action"=>"create"} permitted: false>
[2] pry(#<DrinksController>)> 
ターミナル(binding.pryせずnewアクションを実行)
Started POST "/drinks" for ::1 at 2020-07-31 20:43:53 +0900
Processing by DrinksController#create as HTML
  Parameters: {"authenticity_token"=>"YyS7wjbf32ZE20LJX4EZrDJPQ7LntFQJs8EjEyFIinjdla4MNhgh9GG63uN8rdMIwTYn+mKZCERe2kTxds1jcg==", "drink"=>{"name"=>"熱燗", "price"=>"500円", "comment"=>"冬"}, "commit"=>"更新"}
  Rendering drinks/create.html.haml within layouts/application
  Rendered drinks/create.html.haml within layouts/application (Duration: 0.3ms | Allocations: 38)
[Webpacker] Everything's up-to-date. Nothing to do
  Restaurant Load (0.5ms)  SELECT `restaurants`.* FROM `restaurants` WHERE `restaurants`.`id` = 1 ORDER BY `restaurants`.`id` ASC LIMIT 1
  ↳ app/views/layouts/application.html.haml:17
Completed 200 OK in 55ms (Views: 50.8ms | ActiveRecord: 0.5ms | Allocations: 32668)

 

初学者のため初歩的なミスかとは思うのですが、ご教授頂けますと幸いです。
宜しくお願い致します。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • suama

    2020/07/31 20:00

    Started POST "/drinks" のあとに、ログは出ていませんか?
    うまく動いていたらSQLのINSERT... 文がログに出ていたりします。なにか条件が足りていないなら、その辺もログに出ます。
    モデルも添えていただけるといいのでは。

    キャンセル

  • kyota.kaneshima

    2020/07/31 20:21

    確認頂き誠にありがとうございます。
    そんな中、大変恐縮なのですが、Started POST "/drinks" のあとはターミナルのブロックに記載してある通りの記述がされており(特に削除している部分はありません)、おそらくログのような物はでていないと思われます。見ている箇所が違いましたら誠に申し訳ございません。
    ご指摘いただきました通り、記述少ないですがモデルの記述追加させていただきました。

    キャンセル

  • suama

    2020/07/31 20:31

    binding.pryを無しにして、View (**.html.erb) が呼ばれて描画されるまでのログはどうでしょう?
    また、「500円」のところは文字列で入るのでしょうか?数字ではなくて?

    テーブルを作っているので、migrationファイルのほうはどうでしょう?

    キャンセル

  • kyota.kaneshima

    2020/07/31 20:58

    度々、ありがとうございます。
    priceの部分については、とりあえずという気持ちで文字列にしておりました。
    ご指摘頂いたbiding.pryなしのログと
    マイグレーションファイルの記述を追加しました。
    言われたことしかできず申し訳ないです。宜しくお願い致します。

    キャンセル

回答 1

0

drinksテーブルに保存させたいのであれば、
drink.rbのself.abstract_class = trueはおそらく不要です!

追記
drink.rbのクラス名がApplicationRecordになっている点も気になりました。
掲載ミス?

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 87.49%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る