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

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

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

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

Ruby

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

Ruby on Rails

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

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

Q&A

解決済

1回答

1487閲覧

【Rails】1つのform_withで複数モデルへデータ登録をしたい

Rvato

総合スコア6

Haml

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

Ruby

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

Ruby on Rails

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

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

0グッド

0クリップ

投稿2020/09/12 01:46

編集2020/09/12 12:46

前提・実現したいこと

ポケモンのデータを1〜6匹入力し、パーティ(グループ)として登録するアプリを作成中です。必要データを入力しsubmitボタンを押下してデータ登録を行います。
2つのモデルを使用するためfields_forを使用します。

必要データを入力するとポケモンに関する情報は登録されずパーティ名(グループ名)だけ登録されてしまいます。

▼ 開発環境
Rails 5.2.4.3
Mac OS

ターミナル/SequelPro

イメージ説明
イメージ説明

該当/関連のソースコード

▼ _party.html.haml

haml

1= form_with model: @party, local: true, class: "party-register" do |f| 2 .party 3 4 .party__wrap 5 = f.fields_for :pokemon do |pokemon| 6 7 .party__wrap__top 8 -# ------------------------ 1匹目 ------------------------ #- 9 .party__wrap__top__pokemon1 10 .pokemon-container 11 = icon 'fas', 'angle-double-down', class: "angle-double-down-icon" 12 1st 13 .pokemon-container__top 14 -# ---- ポケモン ---- #- 15 .pokemon-container__top__name 16 .label-name 17 ポケモン 18 .form-name 19 = pokemon.text_field :name, class: "form-name__input", maxlength: "6", type: "text", autocomplete: "off" 20 -# ---- ニックネーム ---- #- 21 .pokemon-container__top__nickname 22 .label-nickname 23 ニックネーム 24 .form-nickname 25 = pokemon.text_field :nickname, class: "form-nickname__input", maxlength: "12", type: "text", autocomplete: "off" 26 -# ---- 性別 ---- #- 27 .pokemon-container__top__gender 28 .label-gender 29 性別 30 .form-gender 31 %select{ name: "exp_gender", type: "text", class: "form-gender__input", id: "exp_gender" } 32 %option{ value: "" } ---- 33 %option{ value: "1" }34 %option{ value: "2" }35 %option{ value: "3" } 不明 36 37------------ 中略 ------------ 38 39 .party-name 40 パーティ名 41 = f.text_field :party_name, class: "party-name__input", maxlength: "6", type: "text", autocomplete: "off" 42 43 .register-btn 44 .register-btn__text 45 = f.submit "登録する", class: "register-btn__text__submit"

▼ pokemon.rb

class Pokemon < ApplicationRecord belongs_to :party end

▼ party.rb

class Party < ApplicationRecord has_many :pokemons accepts_nested_attributes_for :pokemons validates :party_name, presence: true end

▼ マイグレーションファイル [create_pokemons.rb]

class CreatePokemons < ActiveRecord::Migration[5.2] def change create_table :pokemons do |t| t.string :name, null: false t.string :nickname t.string :gender, null: false t.string :ability, null: false t.string :nature, null: false t.string :item t.string :move1, null: false t.string :move2 t.string :move3 t.string :move4 t.string :cs_hp, null: false t.string :cs_attack, null: false t.string :cs_defense, null: false t.string :cs_special_attack, null: false t.string :cs_special_defense, null: false t.string :cs_speed, null: false t.string :bs_hp, null: false t.string :bs_attack, null: false t.string :bs_defense, null: false t.string :bs_special_attack, null: false t.string :bs_special_defense, null: false t.string :bs_speed, null: false t.string :ev_hp t.string :ev_attack t.string :ev_defense t.string :ev_special_attack t.string :ev_special_defense t.string :ev_speed t.timestamps end end end

▼ マイグレーションファイル [create_parties.rb]

class CreateParties < ActiveRecord::Migration[5.2] def change create_table :parties do |t| t.string :party_name, null: false t.timestamps end end end

補足情報

▼ 略称について
cs = current status現在のステータス
bs = base status種族値
ev = effort value努力値

▼ 参考記事/質問
複数モデルにデータを保存したい
fields_forの上手な使い方

▼ 質問履歴
【Rails】ActionController::ParameterMissingが表示されデータが保存されない
【Rails】form_withのsubmitボタンが反応しない
【Rails】ActiveRecord::NotNullViolationのエラーでデータが保存されない
【Rails】form_withでfields_forを使用したいがエラーが発生してページを表示できない

▼ 仮説と検証作業の結果
仮説として問題が、hamlの記述かもしくはモデルにあると思っていますが見当つきません。
何か気づきがありましたらご意見頂戴したいです。

追記 [2020.9.12]

▼ parties_controller

class PartiesController < ApplicationController def index end def new @pokemon = Pokemon.new @party = Party.new @party.build_pokemon end def create @pokemon = Pokemon.new(pokemon_params) @pokemon.save @party = Party.new(party_params) @party.save redirect_to root_path, notice: 'パーティを作成しました' end def show @party = Party.find(params[:id]) end def edit @party = Party.find(params[:id]) end def update @party = Party.find(params[:id]) end def destroy @party = Party.find(params[:id]) end private def pokemon_params params.permit( :name, :nickname, :gender, :ability, :nature, :item, :move1, :move2, :move3, :move4, :cs_hp, :cs_attack, :cs_defense, :cs_special_attack, :cs_special_defense, :cs_speed, :bs_hp, :bs_attack, :bs_defense, :bs_special_attack, :bs_special_defense, :bs_speed, :ev_hp, :ev_attack, :ev_defense, :ev_special_attack, :ev_special_defense, :ev_speed ) end def party_params params.permit( :party_name, pokemons_attributes:[ :name, :nickname, :gender, :ability, :nature, :item, :move1, :move2, :move3, :move4, :cs_hp, :cs_attack, :cs_defense, :cs_special_attack, :cs_special_defense, :cs_speed, :bs_hp, :bs_attack, :bs_defense, :bs_special_attack, :bs_special_defense, :bs_speed, :ev_hp, :ev_attack, :ev_defense, :ev_special_attack, :ev_special_defense, :ev_speed ] ) end end

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

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

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

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

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

unhappychoice

2020/09/12 01:56

controller のコードに原因がある気がするので、掲載をお願いしますmm
Rvato

2020/09/12 12:49

追記依頼ありがとうございます。 controllerのコードを最下部に追記しました。
guest

回答1

0

ベストアンサー

Unpermitted parameters: :utf8, :authenticity_token, :pokemon, :exp_gender, :exp_item, :party_name, :commit

とあるので、コントローラーにて strong parameter の設定を確認してください。
リクエストのパラメーターには含まれていても、保存時に許可されていないように見えます。

追記

<!-- = f.fields_for :pokemon do |pokemon| --> = f.fields_for :pokemons do |pokemon| <!-- accept_nested_attributes_for の名称と合わせる必要があります -->
class PartiesController < ApplicationController # ... def create # accept_nested_attributes_for しているので、 @party.save で Pokemon も保存されます # @pokemon = Pokemon.new(pokemon_params) # @pokemon.save @party = Party.new(party_params) @party.save redirect_to root_path, notice: 'パーティを作成しました' end def show @party = Party.find(params[:id]) end def edit @party = Party.find(params[:id]) end def update @party = Party.find(params[:id]) end def destroy @party = Party.find(params[:id]) end private # 不要なはず #def pokemon_params # params.permit( # :name, :nickname, :gender, :ability, :nature, :item, :move1, :move2, :move3, :move4, # :cs_hp, :cs_attack, :cs_defense, :cs_special_attack, :cs_special_defense, :cs_speed, # :bs_hp, :bs_attack, :bs_defense, :bs_special_attack, :bs_special_defense, :bs_speed, # :ev_hp, :ev_attack, :ev_defense, :ev_special_attack, :ev_special_defense, :ev_speed # ) #end def party_params # params は params[:party][:pokemons_attributes] のように入っているので require(:party) は必要そうです params.require(:party).permit( :party_name, pokemons_attributes:[ :name, :nickname, :gender, :ability, :nature, :item, :move1, :move2, :move3, :move4, :cs_hp, :cs_attack, :cs_defense, :cs_special_attack, :cs_special_defense, :cs_speed, :bs_hp, :bs_attack, :bs_defense, :bs_special_attack, :bs_special_defense, :bs_speed, :ev_hp, :ev_attack, :ev_defense, :ev_special_attack, :ev_special_defense, :ev_speed ] ) end end

Pokemon のパラメーターすべてを確認していないのと、 View が中略されているので確実に動くかはわかりませんが、雰囲気はこのような形だと思います。

投稿2020/09/12 05:21

編集2020/09/12 15:04
unhappychoice

総合スコア1531

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

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

Rvato

2020/09/12 12:55

ストロングパラメータですが .require(:party) のような記述を加えると以前エラーが発生しました。 ▼以前に質問したストロングパラメータに関する内容 https://teratail.com/questions/289438 もう少し自分でも関連記事がないか調べてみます。
unhappychoice

2020/09/12 15:06

コントローラーの情報元に追記をしました。
Rvato

2020/09/12 23:23

ご丁寧にありがとうございます。 fields_forはpokemon(モデルを参照しようとしていた)ではなくpokemons(accept_nested_attributes_for の名称)だったのですね…。 本日帰宅後に動作確認してみようと思います。 改めて、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問