やりたいこと
上記の文書中にあるソースを実装しようとしています。
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のカラム
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時間は格闘しているので、精根尽き果ててしまっている状態です。
ご教示いただけると幸いです。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。