🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby

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

Ruby on Rails

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

Q&A

2回答

787閲覧

Ruby on Rails データが保存されません

yu-ka5454

総合スコア3

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2020/11/25 09:20

編集2020/11/25 09:36

前提・実現したいこと

railsで簡易アプリを作成しているのですが、
フォームのデータがDBに保存されません(nilが返ります)。調べても解決しないのでアドバイスを頂けると助かります。

おそらくストロングパラメーターが悪さをしていると思うのですが、、、

seedではデータが挿入できます。

よろしくお願いいたします。

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

/controller.rb

#エラー文
param is missing or the value is empty: weight

該当のソースコード

#routes

Rails.application.routes.draw do
root 'homes#index'
resources :weights, only: [:index, :create, :show, :new]
end

#controller.rb
class WeightsController < ApplicationController
def index
end

def new
@weight = Weight.new(weight_params)
@weight.save

end

def create
if weight = Weight.new(weight_params)
binding.pry
redirect_to weight_path(weight)
else
render :new
end
end

def show
@weight = Weight.find(params[:id])
end

private

def weight_params
params.require(:weight).permit(:age, :weight, :height)
end
end

#new.html.erb

<%= @weight.errors %>

<%= form_for(@weight) do |f| %> <p>年齢</p> <%= f.text_field :age %> <p>身長</p> <%= f.text_field :height %> <p>体重</p> <%= f.text_field :weight %> <br> <%= f.submit "BMIを計算する" %> <% end %>

#モデル
class Weight < ApplicationRecord
#身長と体重にバリーデーションを加える
with_options presence: true do
validates :age
validates :height
validates :weight
end

end

ソースコード

試したこと

ここに問題に対して試したことを記載してください。

#pry-rails

1] pry(#<WeightsController>)> params
=> <ActionController::Parameters {"utf8"=>"✓", "authenticity_token"=>"jrII+JBgIA+aGF3vuGiuHBBoR6sDmaXVyWFpXetG7DCZ5uuHHEd8oBfww6pBQhiTwuNllgmD9xAqyJwFBIzrYQ==", "weight"=><ActionController::Parameters {"age"=>"33", "height"=>"342", "weight"=>"324"} permitted: false>, "commit"=>"BMIを計算する", "controller"=>"weights", "action"=>"create"} permitted: false>
[2] pry(#<WeightsController>)> weight
=> #<Weight:0x00007fbe6f9613d0 id: nil, age: 33, weight: 324, height: 342, created_at: nil, updated_at: nil>
[3] pry(#<WeightsController>)> weight.save
(0.3ms) begin transaction
↳ (pry):3
Weight Create (2.4ms) INSERT INTO "weights" ("age", "weight", "height", "created_at", "updated_at") VALUES (?, ?, ?, ?, ?) [["age", 33], ["weight", 324], ["height", 342], ["created_at", "2020-11-25 09:03:31.813197"], ["updated_at", "2020-11-25 09:03:31.813197"]]
↳ (pry):3
(1.7ms) commit transaction
↳ (pry):3
=> true

#rails c

[1] pry(main)> a = Weight.find(11)
Weight Load (1.7ms) SELECT "weights".* FROM "weights" WHERE "weights"."id" = ? LIMIT ? [["id", 11], ["LIMIT", 1]]
=> #<Weight:0x00007fafc9469990
id: 11,
age: nil,
weight: nil,
height: nil,
created_at: Wed, 25 Nov 2020 07:27:46 UTC +00:00,
updated_at: Wed, 25 Nov 2020 07:27:46 UTC +00:00>
[2] pry(main)> a.age
=> nil

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

ここにより詳細な情報を記載してください。

rails 5.2.4
ruby 2.5.7

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

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

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

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

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

yu-ka5454

2020/11/25 09:38

次回からそのようにします。ご指摘ありがとうございます。
m.ts10806

2020/11/25 09:41 編集

いえ、質問は何度でも編集できます。(そのための「質問への追記・修正依頼」です) 今、してください。いつ来るか分からない「次回」にまわすと必ず忘れます。
guest

回答2

0

create で new してますが、それを save していないです

投稿2020/11/25 09:27

winterboum

総合スコア23567

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

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

yu-ka5454

2020/11/25 09:37

すみません!もともとcreateメソッドで書いてたのですが、newにして書き忘れました。。 saveでも同じようなエラーが出ます。
winterboum

2020/11/25 13:59

1. 「同じ」ですか「同じような」ですか。 2. QA続けたいならm.tsさんのご指摘通りcode読みやすくしてください。読みにくいのでつらいです。
guest

0

「BMIを計算する」をクリックした際にエラーが出るという認識でよろしいでしょうか?

(中略) def create if weight = Weight.new(weight_params) (中略)

createメソッドでいきなり条件分岐でなく、
値をsaveするときにseveできているかの条件式を挟む記述にしてはいかがでしょうか?

def create @weight = Weight.new(weight_params) if @weight.save redirect_to weight_path(weight) else render :new end end

こうすることでcreateアクション内で
最初にデータをcreateし、saveできた場合とできなかった場合で条件分岐も記述できます。

余談ですが、newメソッドで@weightとしたのであればcreateメソッドも**@weight**とした方がいいです。

投稿2020/11/25 23:13

R_Hi-ra

総合スコア12

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

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

yu-ka5454

2020/11/27 10:53

そのような記述はすでに試したのですがダメでした..(>人<;) render :newの前にundefined method `permit' for nil:NilClass や パラメーターが空だと言われます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問