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

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

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

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

Ruby on Rails

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

HTML

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

Q&A

解決済

2回答

1008閲覧

createアクションがうまく機能しない。

ayumu0622

総合スコア23

Ruby

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

Ruby on Rails

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

HTML

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

0グッド

0クリップ

投稿2019/12/02 04:19

編集2019/12/03 03:05

よろしくお願いします。
rails初学者です。
railsで自作の牛群管理ウェブアプリを作っています。

牛の治療記録を個体ごとに管理するため、牛の個体管理をするモデルと治療記録を管理するモデルに1対多の関連付けを行い記録できるようにしたいのですが、うまくいきません。

個体管理のコントローラ(CowsController)のshowアクションで個体情報を表示し、情報の追加ボタンから治療記録を管理するコントローラ(TreatmentsController)のnewアクションに飛びます。
イメージ説明

イメージ説明

フォームに内容を記述しCreate Treatmentボタンでフォームの内容が追加されたCosControllerのshowアクションにリダイレクションしてほしいのですが、ボタンを押すとフォームに記述された内容をそのままにURLだけが変わってしまってしまいます。

イメージ説明

イメージ説明

createアクションに問題があるのかなと思いますが何が、どう問題で解決するにはどうすればいいかわからないです。
解決方法があったら教えていただきたいです。

treatments_controller.rb

ruby

1class TreatmentsController < ApplicationController 2 def new 3 @treat = Treatment.new(posted_at: Date.new(2010,1,1)) 4 end 5 6 def create 7 @treat = Treatment.new(params[:treatment]) 8 if @treat.save 9 redirect_to @cow, notice: "追加しました。" 10 render template:'cows/show' 11 else 12 render "new" 13 end 14 end 15 16end 17

treatments/new.html.erb

html

1<% @page_title = "新規情報の追加" %> 2 3<h1><%= @page_title %></h1> 4 5<td><%= link_to "詳細へ戻る", @cow %></td> 6 7<%= form_for @treat do |form| %> 8 <%= render "form", form: form %> 9 <div><%= form.submit %></div> 10<% end %> 11

treatments/_form.html.erb

html

1<table class = "form"> 2 <tr> 3 <th><%= form.label :posted_at, "日付" %></th> 4 <td><%= form.date_select :posted_at,start_year: 2010, end_year: Time.current.year, 5 use_month_numbers: true %></td> 6 7 <th>項目</th> 8 <td> 9 <%= form.select :content,["治療","受精","妊鑑","乾乳","分娩"] %> 10 </td> 11 </tr> 12 13 <tr> 14 <th>内容</th> 15 <td colspan = "3"><%= form.text_area :detail, size: "70*20" %></td> 16 </tr> 17</table>

cows/show.html.erb

html

1<% @page_title = "詳細" %> 2 3<h1><%= @page_title %></h1> 4 5<td><%= link_to "編集", [:edit, @cow] %>/ 6 <%= link_to "削除", @stall, method: :delete, 7 data: {confirm: "本当に削除しますか?" }%></td> 8<td><%= link_to "一覧へ戻る", :stalls%></td> 9 10<table class = "attr"> 11 <tr> 12 <th>個体識別番号</th> 13 <th>名号</th> 14 <th>生年月日</th> 15 <th>状態</th> 16 </tr> 17 <tr> 18 <td><%= @cow.number %></td> 19 <td><%= @cow.name %></td> 20 <td><%= @cow.birthday %></td> 21 <td><%= @cow.status == 1 ? "経産牛" : "未経産牛" %></td> 22 </tr> 23</table> 24 25<p><td><%= link_to "情報の追加", [:new, @cow, :treatment] %></td></p> 26 27 28 29 <% if @cow.treatments.present? %> 30 <% @cowtreat = @cow.treatments %> 31 <%= @cowinfo.each do |info| %> 32 <tr> 33 <th>日付</th> 34 <th>項目</th> 35 <th>内容</th> 36 </tr> 37 <tr> 38 <td><%= @cowtreat.posted_at %></td> 39 <td><%= @cowtreat.content %></td> 40 <td><%= @cowtreat.detail %></td> 41 </tr> 42 <% end %> 43 <% else %> 44 <p><td>情報はありません</td></p> 45 <% end %> 46 47

フォームを入力した際のログ

Started GET "/cows/13" for ::1 at 2019-12-02 12:48:51 +0900 Processing by CowsController#show as HTML Parameters: {"id"=>"13"} Cow Load (0.5ms) SELECT "cows".* FROM "cows" WHERE "cows"."id" = ? LIMIT ? [["id", 13], ["LIMIT", 1]] ↳ app/controllers/cows_controller.rb:4 Rendering cows/show.html.erb within layouts/application Treatment Load (0.3ms) SELECT "treatments".* FROM "treatments" WHERE "treatments"."cow_id" = ? [["cow_id", 13]] ↳ app/views/cows/show.html.erb:29 Rendered cows/show.html.erb within layouts/application (3.4ms) Completed 200 OK in 43ms (Views: 36.2ms | ActiveRecord: 0.8ms) Started GET "/cows/3" for ::1 at 2019-12-02 12:48:55 +0900 Processing by CowsController#show as HTML Parameters: {"id"=>"3"} Cow Load (0.4ms) SELECT "cows".* FROM "cows" WHERE "cows"."id" = ? LIMIT ? [["id", 3], ["LIMIT", 1]] ↳ app/controllers/cows_controller.rb:4 Rendering cows/show.html.erb within layouts/application Treatment Load (0.3ms) SELECT "treatments".* FROM "treatments" WHERE "treatments"."cow_id" = ? [["cow_id", 3]] ↳ app/views/cows/show.html.erb:29 Rendered cows/show.html.erb within layouts/application (3.2ms) Completed 200 OK in 47ms (Views: 38.3ms | ActiveRecord: 0.7ms) Started GET "/cows/3/treatments/new" for ::1 at 2019-12-02 12:55:27 +0900 Processing by TreatmentsController#new as HTML Parameters: {"cow_id"=>"3"} Rendering treatments/new.html.erb within layouts/application Rendered treatments/_form.html.erb (2.2ms) Rendered treatments/new.html.erb within layouts/application (10.2ms) Completed 200 OK in 58ms (Views: 51.0ms | ActiveRecord: 0.0ms) Started POST "/treatments" for ::1 at 2019-12-02 13:01:24 +0900 Processing by TreatmentsController#create as HTML Parameters: {"utf8"=>"✓", "authenticity_token"=>"DQujGE6hbli4AyRndCDXMAexcNWVHTE7cOYfoVVVvTS70QuhDKOIs6N48zWT2YITD39FrBalJ01tkjfaidgtXg==", "treatment"=>{"posted_at(1i)"=>"2010", "posted_at(2i)"=>"1", "posted_at(3i)"=>"1", "content"=>"治 療", "detail"=>"テスト"}, "commit"=>"Create Treatment"} (0.1ms) begin transaction ↳ app/controllers/treatments_controller.rb:8 (0.1ms) rollback transaction ↳ app/controllers/treatments_controller.rb:8 Rendering treatments/new.html.erb within layouts/application Rendered treatments/_form.html.erb (3.0ms) Rendered treatments/new.html.erb within layouts/application (10.9ms) Completed 200 OK in 57ms (Views: 49.5ms | ActiveRecord: 0.2ms)

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

2019.12.1 15:33追記

ruby

1class TreatmentsController < ApplicationController 2 def new 3 @treat = Treatment.new(posted_at: Date.new(2010,1,1)) 4 end 5 6 def create 7 @treat = Treatment.new(params.require(:treatment).permit(:posted_at, :content, :detail, :cow_id)) 8 if @treat.save 9 redirect_to @cow, notice: "追加しました。" 10 render template:'cows/show' 11 else 12 render "new" 13 end 14 end 15 16end 17

2019.12.2 20:20追記

編集後new.html.erb

html

1<% @page_title = "新規情報の追加" %> 2 3<h1><%= @page_title %></h1> 4 5<td><%= link_to "詳細へ戻る", @cow %></td> 6 7<%= form_for @treat do |form| %> 8<%= form.hidden_field :cow_id %> 9 <%= render "form", form: form %> 10 <div><%= form.submit %></div> 11<% end %> 12

2019.12.3 12:04追記

エラー画面
イメージ説明

フォームの内容が反映された詳細ページ
イメージ説明

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

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

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

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

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

guest

回答2

0

ベストアンサー

原因は:cow_idnilのままレコードを保存しようとして失敗していることだと思います。
が、それよりもデバッグの方法を学びましょう。でないとログをどれだけ眺めても解決しません。

rb

1 def create 2 @treat = Treatment.new(params[:treatment]) 3 # ここで止める 4 # @treat.save! を実行することで例外が表示されるので原因がわかる 5 if @treat.save 6 redirect_to @cow, notice: "追加しました。" 7 render template:'cows/show' 8 else 9 render "new" 10 end 11 end

デバッグにはbinding.prybyebugを使います。
実際に# ここで止めるの位置にコードを仕込んでデバッグしてみてください。

投稿2019/12/02 15:31

Mugheart

総合スコア2344

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

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

ayumu0622

2019/12/03 12:57

ご回答ありがとうございます。 返信が遅くなってしまい申し訳ございません。 デバッグについての知識が全然ないので少し調べていました。 最初に質問を投稿した時から状況が少し変わりまして、newアクションを @treat = Treatment.new(posted_at: Date.new(2010,1,1)) から @treat = Treatment.new(posted_at: Date.new(2010,1,1), cow_id: params[:cow_id]) にしたところcow_idは値が入るようになりましたが、createアクションのリダイレクションがうまくいきませんでした。 (状況の変更の経緯についてはコメントで全部説明しようとすると長くなってしまい分かりづらくなりそうなので、お手数ですがもう一方のコメントのやり取りを見ていただきたいです。) リダイレクションについてはご指摘いただいた方法を使ってできる範囲でデバッグに挑戦してはみました。 デバッグ自体のやり方はなんとなくわかるのですが、読み取ったデータから何をどのように判断して解決のために何を検討すればよいのかがわからないです。
ayumu0622

2019/12/03 12:59

デバッグのログです。 Started GET "/cows/30/treatments/new" for ::1 at 2019-12-03 21:36:47 +0900 Processing by TreatmentsController#new as HTML Parameters: {"cow_id"=>"30"} Rendering treatments/new.html.erb within layouts/application Rendered treatments/_form.html.erb (1.7ms) Rendered treatments/new.html.erb within layouts/application (8.2ms) Completed 200 OK in 51ms (Views: 43.8ms | ActiveRecord: 0.0ms) Started POST "/treatments" for ::1 at 2019-12-03 21:36:48 +0900 Processing by TreatmentsController#create as HTML Parameters: {"utf8"=>"✓", "authenticity_token"=>"nxF2MhmfJrwoog/wV9D4LyHcOPaJAgVBLgM2xBnTqJFu77FZgv5MSVck6RhQ99t8D0zSh47psndzfYluPnUmCw==", "treatment"=>{"cow_id"=>"30", "posted_at(1i)"=>"2010", "posted_at(2i)"=>"1", "posted_at(3i)"=>"1", "content"=>"治療", "detail"=>""}, "commit"=>"Create Treatment"} [5, 14] in /mnt/c/Users/hirotaayumu/Desktop/manage/cowmanager/app/controllers/treatments_controller.rb 5: 6: def create 7: @treat = Treatment.new(params.require(:treatment).permit(:posted_at, :content, :detail, :cow_id)) 8: byebug 9: => 10: if @treat.save 11: redirect_to @cow, notice: "追加しました。" 12: render template:'cows/show' 13: else 14: render "new" (byebug) @treat #<Treatment id: nil, cow_id: 30, posted_at: "2010-01-01", content: "治療", detail: "", created_at: nil, updated_at: nil>(byebug) n (0.4ms) begin transaction ↳ app/controllers/treatments_controller.rb:10 Cow Load (1.3ms) SELECT "cows".* FROM "cows" WHERE "cows"."id" = ? LIMIT ? [["id", 30], ["LIMIT", 1]] ↳ app/controllers/treatments_controller.rb:10 Treatment Create (21.0ms) INSERT INTO "treatments" ("cow_id", "posted_at", "content", "detail", "created_at", "updated_at") VALUES (?, ?, ?, ?, ?, ?) [["cow_id", 30], ["posted_at", "2010-01-01"], ["content", "治療"], ["detail", ""], ["created_at", "2019-12-03 12:37:03.733153"], ["updated_at", "2019-12-03 12:37:03.733153"]] ↳ app/controllers/treatments_controller.rb:10 (8.8ms) commit transaction ↳ app/controllers/treatments_controller.rb:10 [6, 15] in /mnt/c/Users/hirotaayumu/Desktop/manage/cowmanager/app/controllers/treatments_controller.rb 6: def create 7: @treat = Treatment.new(params.require(:treatment).permit(:posted_at, :content, :detail, :cow_id)) 8: byebug 9: 10: if @treat.save => 11: redirect_to @cow, notice: "追加しました。" 12: render template:'cows/show' 13: else 14: render "new" 15: end (byebug) @treat #<Treatment id: 13, cow_id: 30, posted_at: "2010-01-01", content: "治療", detail: "", created_at: "2019-12-03 12:37:03", updated_at: "2019-12-03 12:37:03"> (byebug) @cow nil (byebug)
Mugheart

2019/12/03 13:03

redirect_to @cow の @cow がいきなり出てきているように見えます。デバッグして中身を確認してください。おそらくnilです。redirect nil を実行しようとしているのでnilにリダイレクトできませんというエラーが起きています。エラーの意味はエラーメッセージを読めば理解できたはずです。
ayumu0622

2019/12/04 04:24

エラーメッセージを読んで色々デバッグを試してみたら解決しました。 別のコントローラから@cowを引用しているつもりでしたがうまくいっていませんでした。 @cow =Cow.find( @treat.cow_id) のをcreateアクションに追加したら想定していた動きになりました。 デバッグのことも含め大変勉強になりました。 ありがとうございます。
guest

0

Treatment.new(params[:treatment])

Treatment.new(params.require(:treatment).permit(:content,.... )
として下さい

投稿2019/12/02 05:32

winterboum

総合スコア23329

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

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

ayumu0622

2019/12/02 06:38

前々回に引き続きご回答ありがとうございます。 ご指摘いただいたように変更しましたが状態は変わりませんでした。 変更した部分を質問の方に追記させていただきました。
winterboum

2019/12/02 07:57

cow_idが渡っていないですね。 validationに掛かってsave出来なかったものと。 またあれか? hidden_field がうまく動かない?
ayumu0622

2019/12/02 10:08

hidden_fieldは記述し忘れていました... 前回書いた時と同様にnew.html.erbに <%= form.hidden_field :cow_id %> を記述し治療記録の登録をしてみましたが状況は変わりませんでした。 hidden_fieldを記述した後のlogを見ると、渡されているParameterにcow_idが追加されるようにはなりましたが cow_id =>"" となっていました。
winterboum

2019/12/02 10:16

hidden_field どう書きました? それから、そのviewはどのmethodから呼ばれます?
winterboum

2019/12/02 10:18 編集

treatmentのnewですね。ここにどのcowか、が渡ってないですね。 いや 渡ってるけど受け取って使ってない
ayumu0622

2019/12/02 11:29

hidden_fieldはtreatmentのnewアクションから呼ばれています。 質問に編集後のnew.html.erbを追記しました。 cow_idはとりあえずこのコメント欄に編集後のlogも載せます。
ayumu0622

2019/12/02 11:29

Started POST "/treatments" for ::1 at 2019-12-02 20:24:29 +0900 Processing by TreatmentsController#create as HTML Parameters: {"utf8"=>"✓", "authenticity_token"=>"ZHgl4/5kV6ehy/1xHFxcHzbaAInrtXfIoRyKRqkbWAKVhuKIZQU9Ut5NG5kbe39MGErq+OxewP78YjXsjr3WmA==", "treatment"=>{"cow_id"=>"", "posted_at(1i)"=>"2010", "posted_at(2i)"=>"1", "posted_at(3i)"=>"1", "content"=>"治療", "detail"=>"テスト"}, "commit"=>"Create Treatment"} (0.2ms) begin transaction ↳ app/controllers/treatments_controller.rb:8 (0.1ms) rollback transaction ↳ app/controllers/treatments_controller.rb:8 Rendering treatments/new.html.erb within layouts/application Rendered treatments/_form.html.erb (1.8ms) Rendered treatments/new.html.erb within layouts/application (7.7ms) Completed 200 OK in 101ms (Views: 88.3ms | ActiveRecord: 0.3ms)
winterboum

2019/12/02 23:26

そのtreatmentのnewに渡っているparamsの値を、viewに渡していないですね
ayumu0622

2019/12/03 03:04

showアクションに記述ミス(治療記録を表示するためのインスタンス変数が@cowinfoと@cowtreatでごっちゃになっていたので@cowtreatで統一)があったのでそれを修正しました。 viewにデータが渡っていなかったのはこのためでしょうか... cow_idについて、treatmentのnewアクションを @treat = Treatment.new(posted_at: Date.new(2010,1,1)) から @treat = Treatment.new(posted_at: Date.new(2010,1,1), cow_id: params[:cow_id]) に変更してみたところ、 ①フォームの内容を書いてCreate Cowボタンを押すと ActionController::ActionControllerError が出る(質問に画像を載せます。) ②URLを変更して牛の一覧ページ→個体の詳細ページに飛ぶと治療記録が反映されている。(こちらも画像を載せます) という状態になっていました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問