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

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

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

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

Ruby on Rails

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

Q&A

解決済

1回答

1089閲覧

ruby on railsのgem"cocoon"でデータを保存した際にArgumentErrorが発生

genki0126

総合スコア33

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2021/06/14 03:15

前提・実現したいこと

ruby on rails の環境でgem "cocoon"を使用して一対多の関係のモデルを同時に保存したい。

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

フォームに入力した内容が登録されない

Started POST "/goals" for 172.22.0.1 at 2021-06-14 03:07:07 +0000 Cannot render console from 172.22.0.1! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255 Processing by GoalsController#create as JS Parameters: {"utf8"=>"✓", "authenticity_token"=>"WRLgldSJ8fdtds5dQ2fIeVg8f8Pntonoe94WPzxHxwHVZSTL518WoJ4IbLBpl1yL7mmSIGvj60JxZCVpU5gDsA", "goal"=>{"content"=>"asdf", "start_date"=>"2021-06-14T12:06", "end_date"=>"2021-06-15T12:06", "result"=>"1", "tasks_attributes"=>{"0"=>{"content"=>"asdf", "action"=>"asdf", "start_date"=>"2021-06-14T12:06", "end_date"=>"2021-06-15T12:07", "status"=>"1", "_destroy"=>"false"}}}, "commit"=>"作成"} (0.5ms) BEGIN ↳ app/controllers/goals_controller.rb:31 User Load (0.7ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2 [["id", 1], ["LIMIT", 1]] ↳ app/controllers/goals_controller.rb:31 CACHE User Load (0.0ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2 [["id", 1], ["LIMIT", 1]] ↳ app/controllers/goals_controller.rb:31 (0.6ms) ROLLBACK ↳ app/controllers/goals_controller.rb:31 保存失敗しました!!!!!!!! Completed 500 Internal Server Error in 100ms (ActiveRecord: 5.0ms) ArgumentError (wrong number of arguments (given 0, expected 2)): app/controllers/goals_controller.rb:36:in `create'

該当のソースコード

ruby

1[goal.rb] 2class Goal < ApplicationRecord 3 has_many :tasks, inverse_of: :goal 4 accepts_nested_attributes_for :tasks, allow_destroy: true 5 6 validates :user_id, presence: true 7 validates :content, presence: true 8 validates :result, presence: true 9end 10 11[task.rb] 12class Task < ApplicationRecord 13 belongs_to :goal 14 15 validates :goal_id, presence: true 16 validates :user_id, presence: true 17 validates :content, presence: true 18 validates :action, presence: true 19 validates :status, presence: true 20end 21 22[goals_controller.rb] 23 def new 24 @goal = Goal.new 25 @task = @goal.tasks.build 26 end 27 28 def create 29 @goal = Goal.new(goal_params) 30 31 if @goal.save 32 logger.debug "保存成功しました!!!!!!!!" 33 redirect_to "/", notice: "目標を作成しました" 34 else 35 logger.debug "保存失敗しました!!!!!!!!" 36 logger.debug @goal.errors.full_message 37 render new_goal_path 38 end 39 end 40 41 private 42 43 def goal_params 44 params.require(:goal).permit(:content, :start_date, :end_date, :result, 45 tasks_attributes: [:id, :content, :action, :start_date, :end_date, :status, :_destroy]) 46 .merge(user_id: 1, 47 tasks_attributes: [user_id: 1])# for develop 48 end 49end

ログイン機能は作成中のため、「user_id: 1」で固定値を入力しています。

html

1[new.html.erb] 2 <%= form_with model: @goal do |f| %> 3 <div class="goal-table"> 4 <p> 目標:<%= f.text_field :content, placeholder: "達成したいこと" %> </p> 5 <p> 開始日:<%= f.datetime_field :start_date %> </p> 6 <p> 終了日:<%= f.datetime_field :end_date %> </p> 7 <p> ステータス:<%= f.select :result, GoalState.all.collect { |a| [a.state, a.id] } %></p> 8 <div class="under-line"></div> 9 10 <%= f.fields_for :tasks do |t| %> 11 <%= render "task_fields", f: t %> 12 <% end %> 13 14 <div id="detail-association-insertion-point"></div> 15 16 <%= link_to_add_association "+課題を追加", f, :tasks, 17 class: "btn-task-add btn btn-secondary", 18 data: { 19 association_insertion_node: '#detail-association-insertion-point', 20 association_insertion_method: 'after' 21 } %> 22 </div> 23 <%= f.submit "作成", class: "btn btn-primary" %> 24 <%= link_to "キャンセル", goals_path, class: "btn btn-danger" %> 25 <% end %> 26 27 28[_task_fields.html.erb] 29<div class="nested-fields"> 30 <div class="task-form-area"> 31 <div> 32 <p> 課題:<%= f.text_field :content, placeholder: "目標に対する課題" %> </p> 33 <p> アクション:<%= f.text_field :action, placeholder: "課題を解決するための行動" %> </p> 34 <p> 開始日:<%= f.datetime_field :start_date %> </p> 35 <p> 終了日:<%= f.datetime_field :end_date %> </p> 36 <p> ステータス:<%= f.select :status, TaskState.all.collect { |a| [a.state, a.id] } %></p> 37 </div> 38 <div> 39 <%= link_to_remove_association "課題を削除", f, class: "btn-task-delete btn btn-secondary" %> 40 </div> 41 </div> 42</div>

疑問点

・(エラー内容と関連するか不明ですが、)ストロングパラメータの「merge」部分で関連するモデル(上記の場合はtask)の値を入力することは可能でしょうか?

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

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

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

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

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

guest

回答1

0

ベストアンサー

とりあえず、出ているエラーメッセージを解消するには

logger.debug @goal.errors.full_message

ruby

1logger.debug @goal.errors.full_messages.join("\n")

です

投稿2021/06/14 04:22

asm

総合スコア15147

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

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

genki0126

2021/06/14 11:59

ご指摘ありがとうございます。 ログ出力の処理を修正したところ、以下のログが表示されるようになりました。 Tasks goal can't be blank Tasks content can't be blank Tasks action can't be blank Tasks status can't be blank Taskへ入力値を渡せていないようなので、ストロングパラメータの辺りかパーシャルにしたフォームの連携部分が怪しそうな雰囲気ですが、参考にした記事と実装の差異がわからず詰まってしまいました。 参考にした記事:https://qiita.com/kmjooh/items/a1613531873a22fa7862
asm

2021/06/14 16:09

なるほど、tasks_attributes: [{user_id: 1}]だけはblankになってないのがヒントですね Hash#mergeは衝突した場合、引数の方の値で上書きします。 _task_fields.html.erbに<%= f.hidden_field :user_id, 1 %>と書いてしまった方が楽っぽいですね
genki0126

2021/06/15 03:19

ご指摘の通り修正したところ、エラーログが「Tasks goal can't be blank」のみになりました。 このときにgoal_idのバリデーションを解除すると正常に登録できたため、goal_idが入力できていない状態ということがわかりました。 goal_idを入力するにはどのようにすればいいのでしょうか。 (cocoonのREADMEを見ても外部キーのカラムはxxx_attributes部分に追加されていないため、明示的に入力する処理は実装していませんでした。) 試しにストロングパラメータのtasks_attributesの部分にgoal_idを追加し、user_idと同じようにhidden_fieldでgoal_idを入力してみましたが、「Tasks goal can't be blank」のまま変化しませんでした。
asm

2021/06/15 04:48

気になるのは belongs_to :goalの時点でvalidates :goal_id, presence: trueと同様のvalidateがされるので 後者は不要だったはずです
genki0126

2021/06/15 05:39

そうだったんですね。。。 外部キーのvalidateは削除して実装いたします。 ご協力ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問