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

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

詳細はこちら
Ruby

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

Ruby on Rails

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

データベース

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

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

HTML

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

Q&A

1回答

1675閲覧

Ruby on Railsでform_htmlで保存した値をcontrollerで計算して、show_htmlに表示したいです。

K_I.

総合スコア0

Ruby

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

Ruby on Rails

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

データベース

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

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

HTML

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

0グッド

0クリップ

投稿2021/02/05 13:54

編集2021/02/07 11:56

前提・実現したいこと

Ruby on Railsでform_htmlで保存した値をcontrollerで計算して、show_htmlに表示したいです。
ここに質問の内容を詳しく書いてください。
(例)PHP(CakePHP)で●●なシステムを作っています。
■■な機能を実装中に以下のエラーメッセージが発生しました。

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

controllerで、計算した値がDBに保存されていない。

エラーメッセージ
Processing by HethsController#create as HTML Parameters: {"utf8"=>"✓", "authenticity_token"=>"Bk4J62dGwe+i53+NSFGXqdFeXxEIgjymo2H0EUguEKd2FnJX8A5GdHrDd0vZqBGXCx9O57OZ46pr1L9HjtySqQ==", "heth"=>{"name"=>"いけだ", "age"=>"24", "gender"=>"male", "weight"=>"68", "revel"=>"number_two", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"}} (0.6ms) begin transaction ↳ app/controllers/heths_controller.rb:140 Heth Create (16.5ms) INSERT INTO "heths" ("name", "age", "gender", "weight", "created_at", "updated_at", "revel", "password_digest") VALUES (?, ?, ?, ?, ?, ?, ?, ?) [["name", "いけだ"], ["age", 24], ["gender", "male"], ["weight", 68.0], ["created_at", "2021-02-04 09:29:40.509335"], ["updated_at", "2021-02-04 09:29:40.509335"], ["revel", "number_two"], ["password_digest", "$2a$12$/NHI5RxxLtZRrLslaFN8bOmdw4bgpBUSrrvF.or4ffqSCrn2Gm3Uy"]] ↳ app/controllers/heths_controller.rb:140 (10.5ms) commit transaction ↳ app/controllers/heths_controller.rb:140 Redirected to http://192.168.33.10:3000/heths/71 Completed 302 Found in 487ms (ActiveRecord: 27.6ms) Started GET "/heths/71" for 192.168.33.1 at 2021-02-05 08:56:43 +0000 Cannot render console from 192.168.33.1! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255 Processing by HethsController#show as HTML Parameters: {"id"=>"71"} Heth Load (4.6ms) SELECT "heths".* FROM "heths" WHERE "heths"."id" = ? LIMIT ? [["id", 71], ["LIMIT", 1]] ↳ app/controllers/heths_controller.rb:182 CACHE Heth Load (0.1ms) SELECT "heths".* FROM "heths" WHERE "heths"."id" = ? LIMIT ? [["id", 71], ["LIMIT", 1]] ↳ app/controllers/heths_controller.rb:18 Rendering heths/show.html.erb within layouts/application Rendered heths/show.html.erb within layouts/application (1.6ms) Completed 200 OK in 346ms (Views: 265.5ms | ActiveRecord: 4.6ms)

該当のソースコード

**form_html** <%= form_with(model: heth, local: true) do |form| %> <% if heth.errors.any? %> <div class="er"> <div id="error_explanation"> <h2><%= pluralize(heth.errors.count, "error") %> が発生しました。</h2> <ul> <% heth.errors.full_messages.each do |message| %> <ul><%= message %></ul> <% end %> </ul> </div> </div> <% end %> <div class="form"> <h1>アカウント登録</h1> <div class="field"> <%= form.label :name, "名前" %> <%= form.text_field :name %> </div> <div class="field"> <%= form.label :age, "年齢" %> <%= form.number_field :age %> </div> <div class="field"> <%= form.radio_button :gender, :male %> <%= form.label :gender, "男性", {value: :"男性", style: "display: inline-block;"} %> <%= form.radio_button :gender, :female %> <%= form.label :gender, "女性", {value: :"女性", style: "display: inline-block;"} %> </div> <div class="field"> <%= form.label :weight, "体重" %> <%= form.number_field :weight %> </div> <div class="field"> <%= form.radio_button :revel, :number_one %> <%= form.label :revel, "レベルⅠ", {value: :"レベルⅠ", style: "display: inline-block;"} %> <%= form.radio_button :revel, :number_two %> <%= form.label :revel, "レベルⅡ", {value: :"レベルⅡ", style: "display: inline-block;"} %> <%= form.radio_button :revel, :number_three %> <%= form.label :revel, "レベルⅢ", {value: :"レベルⅢ", style: "display: inline-block;"} %> </div> <div class="text"> <h3>日頃の生活の運動レベルを選んで下さい</h3> <h3>レベルⅠ:生活の大部分が座位で、静的な活動が中心の場合</h3> <h3>レベルⅡ:座位中心の仕事だが、職場内での移動や立位での作業・接客等、あるいは通勤・買物・家事、軽いスポーツ等のいずれかを含む場合</h3> <h3>レベルⅢ:移動や立位の多い仕事への従事者。あるいは、スポーツなど余暇における活発な運動習慣をもっている場合</h3> </div> <div class="field"> <%= form.label :password, "パスワード" %> <%= form.password_field :password %> </div> <div class="field"> <%= form.label :password_confirmation, "もう一度パスワードを入力して下さい" %> <%= form.password_field :password_confirmation %> </div> <div class="bota"> <input type="submit" value"登録" class="button"> <div class="back"> <span><%= link_to 'Back', heths_path %></span> </div> </div> </div> <% end %> </body> **heths_controller** def index @heths = Heth.all end # GET /heths/1 # GET /heths/1.json # 個別のデータを扱う def show # Hethモデルを使って、Heathのテーブルから id が params[:id]のデータを取得する # /healsths?id=1 # @heth = Heth.find_by(id: 1) @heth = Heth.find_by(id : params[id]) age = params[:age] gender = params[:gender] weight = params[:weight] if gender == "male" if age == 1 || age == 2 a = 61 elsif age >= 3 && age <= 5 a = 54.8 elsif age == 6 || age == 7 a = 44.3 elsif age == 8 || age == 9 a = 40.8 elsif age == 10 || age == 11 a = 37.4 elsif age >= 12 && age <= 14 a = 31 elsif age>= 15 && age <= 17 a = 27 elsif age >= 18 && age <= 29 a = 24 elsif age >= 30 && age <= 49 a = 22.3 elsif age >= 50 a = 21.5 end elsif gender == "female" if age == 1 || age == 2 a = 59.7 elsif age >= 3 && age <= 5 a = 52.2 elsif age == 6 || age == 7 a = 41.9 elsif age == 8 || age == 9 a = 38.3 elsif age == 10 || age == 11 a = 34.8 elsif age >= 12 && age <= 14 a = 29.6 elsif age >= 15 && age <= 17 a = 25.3 elsif age >= 18 && age <= 29 a = 22.1 elsif age >= 30 && age <= 49 a = 21.7 elsif age >= 50 a = 20.7 end vasekcal = a * weight end level = params[:level] if level == "number_one" if age == 1 || age == 2 rv = 1 elsif age >= 3 && age <= 5 rv = 1 elsif age == 6 || age == 7 rv = 1.35 elsif age == 8 || age == 9 rv = 1.4 elsif age >= 10 && age <= 14 rv = 1.45 elsif age >= 15 && age <= 17 rv = 1.55 elsif age >= 18 && age <= 69 rv = 1.5 elsif age >= 70 rv = 1.45 end elsif level == "number_two" if age == 1 || age == 2 rv = 1.35 elsif age >= 3 && age <= 5 rv = 1.45 elsif age == 6 || age == 7 rv = 1.55 elsif age == 8 || age == 9 rv = 1.6 elsif age >= 10 && age <= 14 rv = 1.65 elsif age >= 15 && age <= 69 rv = 1.75 elsif age >= 70 rv = 1.7 end elsif level == "number_three" if age == 1 || age == 2 rv = 1 elsif age >= 3 && age <= 5 rv = 1 elsif age == 6 || age == 7 rv = 1.75 elsif age == 8 || age == 9 rv = 1.8 elsif age >= 10 && age <= 14 rv = 1.85 elsif age >= 15 && age <= 17 rv = 1.95 elsif age >= 18 && age <= 69 rv = 2 elsif age >= 70 rv = 1.95 end kcal = vasekcal * rv end @heth_kcal = Heth.new(kcal) end # GET /heths/new def new @heth = Heth.new(user_params) end # GET /heths/1/edit def edit end # POST /heths # POST /heths.json def create @heth = Heth.new(heth_params) @heth_kcal = kcal @heth_kcal.save respond_to do |format| if @heth.save format.html { redirect_to @heth, notice: 'Heth was successfully created.' } format.json { render :show, status: :created, location: @heth } else format.html { render :new } format.json { render json: @heth.errors, status: :unprocessable_entity } end end end private # Use callbacks to share common setup or constraints between actions. def set_heth @heth = Heth.find(params[:id]) end # Never trust parameters from the scary internet, only allow the white list through. # permit(:カラム名) def heth_params params.require(:heth).permit(:name, :age, :gender, :weight, :revel, :kcal, :password, :password_confirmation) end **show_html** <!DOCTYPE html> <html lang="ja"> <head> </head> <body> <div class="daycal"> <h1>1日の摂取カロリー目安</h1> <h1><%= @heth_kcal %></h1> <div class="lin"> <%= link_to 'Edit', edit_heth_path(@heths) %> <%= link_to '今日の摂取カロリー', new_health_path %> </div> </div> </body> <footer> </footer> </html> コード
ソースコード

試したこと

controllerに値を保存するために、def create で.saveを追加しました。
ここに問題に対して試したことを記載してください。

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

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

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

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

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

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

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

guest

回答1

0

show アクションでは id しかパラメータとして受け取っていないように見えますが、以下はどうやって受け取る前提で考えていますか?

n = params[:age] g = params[:gender] w = params[:weight] r = params[:revel]

これらのパラメータが渡されているようには見受けられないので、全て nil になっており、結果条件分岐のどこにも該当するものがなく、期待した結果を得られていないように見えます。

あと、 return vasekcal など show アクションの途中で return が書いてありますが、これだと show アクション抜けちゃいます。仮に上のパラメータを受け取れるようになっても期待通りの動作のしないのではないでしょうか。
show.html.erb かな?ビューを見る限り @heth_kcal を使った表示をしたいようなので、この変数に値を入れることがこのコントローラの役目なんじゃないかと思いますが、これに値を入れることなく抜けちゃってるようです。


以下は質問の回答とは別に、コードを改善するための余談です。

  • 「レベル」という言葉が一般的に言われる意味のものであれば、綴りは level となります。こちらへの修正を推奨します。
  • Heth とは何を意味しますか?フォームを見る限り健康状態管理っぽいものをやりたさそうなので health とかなのか。。。という気はしますが、モデル名はなるべく表現するものを名前だけで判別できるよう命名してください。例えば、欲しい本ってタイトルで探しますよね?
  • n = params[:age] のような1文字変数は使わず、内容を示す分かりやすい変数名を使ってください。ここでは age = params[:age] とするのが適当だと思います。上と同じで、コードを読む時に何が入っているか名前だけでわかるかどうかはとても重要です。他の変数についても全て同じ。aとwとかのような1文字変数は原則的に避けた方が良いです。

コードは「何をやりたいか」の具体的に示しているという面もあるので、それが伝わりにくいコードはその後の修正に苦しみます。上に書いたことは絶対ってわけじゃないんですが、こちらで効率よく回答やアドバイスをもらうためにも修正したほうがよいかな、と思います。


なるほど。コメントいただいて意味がわかってきましたが、age, weight, gender はすでに heth モデルのプロパティとして保存して、show アクションではその内容をもとに計算結果を出力したいわけですね。

age = params[:age]

こういう感じで param で値を受け取るのは、あくまでリンク元やフォームで何らかのユーザ入力が行われたときのためのものです。
show アクションではすでに保存済みのデータをロードしてそれを利用するのですから、

@heth = Heth.find_by(id : params[id]) age = @heth.age gender = @heth.gender weight = @heth.weight level = @heth.level

と書くのが正しいやり方です。

あと、下の方にあるこれは多分動かないのです。

@heth_kcal = Heth.new(kcal)

エラーになるかな? kcal という変数を使う意味がなさそうなので、

@heth_kcal = vasekcal * rv

でいいんじゃないかと思います。

が、これそもそもフォーム入力での保存もうまくいっていなさそう。。。そこから直したいという質問だったんでしょうか?

投稿2021/02/05 17:37

編集2021/02/08 09:15
oakbow

総合スコア227

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

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

K_I.

2021/02/07 11:07

ご指摘いただきありがとうございます。 form_htmlでform_withで入力された値をDBに保存し、showアクションで呼び出し、計算したいです。
K_I.

2021/02/07 11:13

コードの改善点もご指摘いただきありがとうございます。以後気を付けてコードを書いていきたいと思います。
K_I.

2021/02/09 09:26

質問にご回答いただきありがとうございます。 答えていただいたところも気になっておりました。 そうですね、フォーム入力での保存が上手くいっていないところから直したっかったです。 上手く質問できずにすいませんでした。
oakbow

2021/02/09 09:29

なるほど。そこはうまくいっているのかなと早合点してました。ちょっと修正しますのでしばらくお待ちください
K_I.

2021/02/09 09:30

説明が足りなくて申し訳なっかったのですが、kcalという変数で保存を行い、別の計算に使おうと考えておりました。
K_I.

2021/02/09 09:31

すいません、よろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問