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

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

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

Haml(HTML abstraction markup language)は、HTML/XHTMLを効率的に記述するためのマークアップ言語および記法です。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Model

MVCモデルの一部であるModelはアプリケーションで扱うデータとその動作を管理するために扱います。

Ruby on Rails

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

Q&A

解決済

2回答

426閲覧

親子レコードを1つのフォームで実現する上で、paramsに子レコード_attributesというキーを含めたいが、子レコードの複数形がキー名として表示される

shota-imoto

総合スコア37

Haml

Haml(HTML abstraction markup language)は、HTML/XHTMLを効率的に記述するためのマークアップ言語および記法です。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Model

MVCモデルの一部であるModelはアプリケーションで扱うデータとその動作を管理するために扱います。

Ruby on Rails

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

0グッド

0クリップ

投稿2020/05/17 23:23

やりたいこと

公式文書:親レコードと子レコードの保存

上記の文書中にあるソースを実装しようとしています。

rails

1class Person 2 def projects 3 [@project1, @project2] 4 end 5 6 def projects_attributes=(attributes) 7 # Process the attributes hash 8 end 9end

これはaccepts_nested_attributes_forを用いたモデルと同じ形のモデルを作成しようとしていて、具体的には

params=>{name: XX, age: YY, projects_attributes[{size: ZZ, results: AA},{size: BB, result: CC}]

form_withでこのように送信するようにしたい、というイメージです。
また、projects_attributesについては送るデータの数を可変とする予定です。

※accepts~を用いた方法は別の質問にて試行錯誤して、うまく言っていない状態です。

知りたいこと

「# process the attributes hash」をどう記述すればよいのかご教示いただきたく質問しました。

#試したこと
セッターの記述なので、色々試してみるのですが、どれもうまくいきません。
paramsの値は以下のようになります。
↓tuningsがprojectsにあたります。これがtunings_attributesになってほしい。

=> <ActionController::Parameters {"utf8"=>"✓", "authenticity_token"=>"hfwMQRaiJKcAP2ffGs1S0S8gcLwPITuUKIn1n2bY6A5uh9VstcfbyeNWymc2UZ97poZWWynxe5RbzETUGmQQ4g==", "instrument_name"=>"5strings banjo", "instrument_id"=>"1", "tunings"=>{"string_num"=>"5", "note_name"=>"a"}, "name"=>"e", "commit"=>"登録", "controller"=>"tuning_alls", "action"=>"create"} permitted: false>

皆目検討つかぬ、といった状態です。

##ソース
↓tuning_allがpersonにあたり、tuningsがprojectsにあたります。

rails

1class TuningAll < ApplicationRecord 2 has_many :finger_alls 3 #子モデルとアソシエーションを組んでいます 4 has_many :tunings 5 belongs_to :instrument 6 belongs_to :user 7 8 9 def tuning 10 [@tuning1, @tuning2] 11 end 12 13 #このセッターの記述をあれこれ変更しています。 14 def tunings_attributes=(attributes) 15 @tunings_attributes = attributes 16 end 17end

tuning_allとtuningの持つそれぞれのカラムは次の図の通りです。

  • tuning_allのカラム

tuning_all

  • tuningのカラム

tuning

viewファイル

rails

1.content 2 =form_with url: tuning_alls_path, method: :post, local: true do |f| 3 .content__instrument-name 4 =f.text_field :instrument_name, id: "search_instrument_name", placeholder: "楽器名称" 5 =f.text_field :instrument_id, id: "selected_instrument_id", class: "form_blind" 6 .content__search-result 7 8 .content__strings 9 =f.fields_for :tunings do |tuning| 10 .strings__string 11 =tuning.hidden_field :string_num, value: 5 12 =tuning.text_field :note_name, placeholder: "string" 13 .content__name 14 名称 15 =f.text_field :name 16 .content__btn 17 =f.submit "登録"

controllerファイル

rails

1class TuningAllsController < ApplicationController 2 def new 3 @tuning_all = TuningAll.new 4 @tuning_all.tunings.build 5 end 6 7 def create 8  #こちら以下はtuningのままでも一応は保存できるようにnewとsaveを分けて記述しています。 9 @tuning_all = TuningAll.new(tuning_all_params) 10 @tuning_all.save 11 @tuning = Tuning.new(tuning_params[:tunings]) 12 @tuning[:tuning_all_id]=@tuning_all.id 13 @tuning.save! 14 end 15 16 private 17 #こちら以下はキー名がtuningのままでも一応は保存できるようにストロングパラメータを分けて記述しています。 18 def tuning_all_params 19 params.permit(:name, :instrument_id).merge(user_id: current_user.id) 20 end 21 22 def tuning_params 23 params. permit(tunings:[:string_num, :note_name]) 24 # .merge(tuning_all_id: @tuning_all.id) 25 end 26end

##試した書き換えパターン

rails

1# No.1 2 def tunings_attributes=(attributes) 3 @tunings_attributes = string_num, note_name 4 end 5 6#No.2 unexpectな記述エラー 7 def tunings_attributes=(attributes) 8 # {}を()に変えても同様 9 @tunings_attributes = {string_num, note_name} 10 end 11 12#No.3 13 def tunings_attributes=(attributes) 14 @tunings_attributes = [string_num, note_name] 15 end 16 17#No.4 何でも勝手にやってくれるrailsに期待したパターン 18 def tunings_attributes=(attributes) 19 @tunings_attributes = tunings_attributes 20 end 21 22#No.5 23 def tunings_attributes=(attributes) 24 @tunings_attributes = tunings 25 end 26 27#No.6 28 def tunings_attributes=(attributes) 29 @tunings_attributes = attributes 30 end 31 32#No.7 33 def tunings_attributes=(string_num, note_name) 34 @tunings_attributes = string_num, note_name 35 end 36 37#No.8 38 def tunings_attributes=(string_num, note_num) 39 #[]を()に変えるとエラー 40 @tunings_attributes = [string_num, note_num] 41 end

teratailでも質問を投げていますし、かれこれ30時間は格闘しているので、精根尽き果ててしまっている状態です。
ご教示いただけると幸いです。

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

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

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

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

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

guest

回答2

0

自己解決

どうあがいても機能しないので、fields_forの中にfields_forをネストすることで無理やり配列(のような見た目をしたハッシュ)を送ることにしました。
view

rails

1 .content__strings 2 - 8.times do |i| 3 =f.fields_for :tunings_attributes do |tuning_array| 4 =tuning_array.fields_for name="#{i}" do |tuning_hash| 5 .strings__string 6 =tuning_hash.hidden_field :string_num, value: i+1 7 =tuning_hash.text_field :note_name, placeholder: "string#{i+1}"

params出力は次のようになります

=> <ActionController::Parameters {"instrument_name"=>"5strings banjo", "instrument_id"=>"1", "tunings_attributes"=>{"0"=>{"string_num"=>"1", "note_name"=>"a"}, "1"=>{"string_num"=>"2", "note_name"=>"s"}, "2"=>{"string_num"=>"3", "note_name"=>"d"}, "3"=>{"string_num"=>"4", "note_name"=>"f"}, "4"=>{"string_num"=>"5", "note_name"=>"g"}, "5"=>{"string_num"=>"6", "note_name"=>"h"}, "6"=>{"string_num"=>"7", "note_name"=>"j"}, "7"=>{"string_num"=>"8", "note_name"=>"k"}}, "name"=>"iuy", "commit"=>"登録", "controller"=>"tuning_alls", "action"=>"create"} permitted: false>

あとはコントローラで良きに計らいます。

投稿2020/05/18 11:26

shota-imoto

総合スコア37

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

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

0

class TuningAll に accepts_nested_attributes_for :tunings
を追加してください。

投稿2020/05/18 00:13

winterboum

総合スコア23284

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

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

shota-imoto

2020/05/18 01:00

再度、accepts~を追記して試したましたが、paramsの内容に変化なしです。 文中のリンク先にある質問にもあるように反応しないため、別の方法をとろうとしているのがこの質問の主旨です。
shota-imoto

2020/05/18 01:02 編集

https://teratail.com/questions/260372 こちらの内容でも同様のことを実装しようとしています。 accepts~に関してはこちらで教えていただけると幸いでございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問