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

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

ただいまの
回答率

90.00%

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

解決済

回答 2

投稿 編集

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

ayumu0622

score 13

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

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

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

イメージ説明

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

イメージ説明

イメージ説明

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

treatments_controller.rb

class TreatmentsController < ApplicationController
  def new
    @treat = Treatment.new(posted_at: Date.new(2010,1,1))
  end

  def create
    @treat = Treatment.new(params[:treatment])
       if @treat.save
         redirect_to @cow, notice: "追加しました。"
         render template:'cows/show'
       else
         render "new"
       end
  end

end

treatments/new.html.erb

<% @page_title = "新規情報の追加" %>

<h1><%= @page_title %></h1>

<td><%= link_to "詳細へ戻る", @cow %></td>

<%= form_for @treat do |form| %>
  <%= render "form", form: form %>
  <div><%= form.submit %></div>
<% end %>


treatments/_form.html.erb

<table class = "form">
   <tr>
     <th><%= form.label :posted_at, "日付" %></th>
     <td><%= form.date_select :posted_at,start_year: 2010, end_year: Time.current.year,
             use_month_numbers: true %></td>

     <th>項目</th>
       <td>
         <%= form.select :content,["治療","受精","妊鑑","乾乳","分娩"] %>
       </td>
     </tr>

     <tr>
      <th>内容</th>
      <td colspan = "3"><%= form.text_area :detail, size: "70*20" %></td>
     </tr>
</table>  

cows/show.html.erb

<% @page_title = "詳細" %>

<h1><%= @page_title %></h1>

<td><%= link_to "編集", [:edit, @cow] %>/
    <%= link_to "削除",  @stall, method: :delete, 
        data: {confirm: "本当に削除しますか?" }%></td>
<td><%= link_to "一覧へ戻る", :stalls%></td>

<table class = "attr">
  <tr>
    <th>個体識別番号</th>
    <th>名号</th>
    <th>生年月日</th>
    <th>状態</th>
  </tr>
  <tr>
    <td><%= @cow.number %></td>
    <td><%= @cow.name %></td>
    <td><%= @cow.birthday %></td>
    <td><%= @cow.status == 1 ? "経産牛" : "未経産牛" %></td>
  </tr>
</table>

<p><td><%= link_to "情報の追加", [:new, @cow, :treatment] %></td></p>



  <% if @cow.treatments.present? %>
    <% @cowtreat = @cow.treatments %>
    <%= @cowinfo.each do |info| %>
      <tr>
        <th>日付</th>
        <th>項目</th>
        <th>内容</th>
      </tr>
      <tr>
        <td><%= @cowtreat.posted_at %></td>
        <td><%= @cowtreat.content %></td>
        <td><%= @cowtreat.detail %></td>
      </tr>
    <% end %>
  <% else %>
    <p><td>情報はありません</td></p>
  <% end %>

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

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追記

class TreatmentsController < ApplicationController
  def new
    @treat = Treatment.new(posted_at: Date.new(2010,1,1))
  end

  def create
    @treat = Treatment.new(params.require(:treatment).permit(:posted_at, :content, :detail, :cow_id))
       if @treat.save
         redirect_to @cow, notice: "追加しました。"
         render template:'cows/show'
       else
         render "new"
       end
  end

end

2019.12.2 20:20追記

編集後new.html.erb

<% @page_title = "新規情報の追加" %>

<h1><%= @page_title %></h1>

<td><%= link_to "詳細へ戻る", @cow %></td>

<%= form_for @treat do |form| %>
<%= form.hidden_field :cow_id %>
  <%= render "form", form: form %>
  <div><%= form.submit %></div>
<% end %>

2019.12.3 12:04追記

エラー画面
イメージ説明

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

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+1

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

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


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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/12/03 21: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アクションのリダイレクションがうまくいきませんでした。
    (状況の変更の経緯についてはコメントで全部説明しようとすると長くなってしまい分かりづらくなりそうなので、お手数ですがもう一方のコメントのやり取りを見ていただきたいです。)

    リダイレクションについてはご指摘いただいた方法を使ってできる範囲でデバッグに挑戦してはみました。
    デバッグ自体のやり方はなんとなくわかるのですが、読み取ったデータから何をどのように判断して解決のために何を検討すればよいのかがわからないです。

    キャンセル

  • 2019/12/03 21: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)

    キャンセル

  • 2019/12/03 22:03

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

    キャンセル

  • 2019/12/04 13:24

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

    キャンセル

+1

Treatment.new(params[:treatment])

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/12/02 20: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)

    キャンセル

  • 2019/12/03 08:26

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

    キャンセル

  • 2019/12/03 12: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を変更して牛の一覧ページ→個体の詳細ページに飛ぶと治療記録が反映されている。(こちらも画像を載せます)

    という状態になっていました。

    キャンセル

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

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