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

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

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

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

843閲覧

動的フォームの入力内容が子テーブルに保存されない

na22ky

総合スコア0

Ruby on Rails

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/05/23 03:39

前提・実現したいこと

railsでレシピアプリ を作っています。
入力フォームから
・材料の名前と数量
・手順の番号と方法
を入力できるようにjqueryで動的フォームを作りました。
その内容をrecipesテーブルに紐付けたmaterialsテーブルとstepsテーブルに格納したいです。

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

動的フォームに入力した値がデータベースに格納されません。

該当のソースコード

Recipe.rb

class Recipe < ApplicationRecord acts_as_taggable_on :labels acts_as_taggable mount_uploader :image, ImageUploader has_many :materials has_many :steps accepts_nested_attributes_for :materials, allow_destroy: true accepts_nested_attributes_for :steps, allow_destroy: true end

meterial.rb

class Material < ApplicationRecord belongs_to :recipe, optional: true end

step.rb

class Step < ApplicationRecord belongs_to :recipe, optional: true end

recipes_controller.rb

def index if params[:tag] @recipes = Recipe.tagged_with(params[:tag]) else @recipes = Recipe.all end end def new @recipe = Recipe.new @recipe.materials.build @recipe.steps.build end def create binding.pry @recipe = Recipe.new(recipe_params) @recipe.save redirect_to root_path end private def recipe_params params.require(:recipe).permit(:title, :image, :calorie, :sugar, :tag_list, materials_attributes: [:name, :amount], steps_attributes: [:number, :process]) end end

new.html.erb

<div class="materials_field"> <%= form.fields_for :materials, @recipe.materials do |material| %> <div class="material_field" id="material_field[0]"> <%= material.text_field :name , placeholder: "食材", name: "name[0]", id:"name[0]" %> <%= material.text_field :amount, placeholder: "量", name: "amount[0]", id:"amount[0]" %> </div> <%= form.button '▽追加する', id: "add_btn",type: "button"%> <% end %> </div> <div class="steps_field"> <%= form.fields_for :steps, @recipe.steps do |step| %> <div class="step_field" id="step_field[0]"> <%= step.number_field :number , placeholder: "番号", name: "number[0]", id: "number[0]" %> <%= step.text_field :process, placeholder: "内容", name: "process[0]", id: "process[0]" %> </div> <%= form.button '▽追加する', id: "add_btn2",type: "button" %> <% end %> </div> <div class="btn-send"> <%= form.submit "投稿する" %> </div> <% end %> </div>

recipes.js

$(function(){ // フォームカウント var frm_cnt =0; // クローン $('#add_btn').on('click', function(){ var original = $('#material_field\[' + frm_cnt + '\]'); var originCnt = frm_cnt; frm_cnt++; original .clone() .appendTo(original) .attr('id', 'material_field[' + frm_cnt + ']') .end() .find('input, text_field').each(function(idx, obj) { $(obj).attr({ id: $(obj).attr('id').replace(/[[0-9]]+$/, '[' + frm_cnt + ']'), name: $(obj).attr('name').replace(/[[0-9]]+$/, '[' + frm_cnt + ']') }); $(obj).val(''); }); }); }); $(function(){ // フォームカウント var frm_cnt =0; // クローン $('#add_btn2').on('click', function(){ var original = $('#step_field\[' + frm_cnt + '\]'); var originCnt = frm_cnt; frm_cnt++; original .clone() .appendTo(original) .attr('id', 'step_field[' + frm_cnt + ']') .end() .find('input, text_field').each(function(idx, obj) { $(obj).attr({ id: $(obj).attr('id').replace(/[[0-9]]+$/, '[' + frm_cnt + ']'), name: $(obj).attr('name').replace(/[[0-9]]+$/, '[' + frm_cnt + ']') }); $(obj).val(''); }); }); });

試したこと

配列にしたデータがきちんと送られているのかbinding.pryを使い確認しました。
配列になり送られていることがわかりました。

<ActionController::Parameters {"utf8"=>"✓", "authenticity_token"=>"0MuSD4D8DxZnmhNQDERZ8hoNx8ElltdTUX179rMgm/vHuoonup8TmXE3XNyNYtU7126d5eVjWB0wJejEyo8q4Q==", "recipe"=><ActionController::Parameters {"title"=>"豆腐", "image"=>#<ActionDispatch::Http::UploadedFile:0x00007f9df4e72888 @tempfile=#<Tempfile:/var/folders/l5/89sfzxzj06q6rdkkxsynx8g00000gn/T/RackMultipart20200523-768-o3u0zy.jpg>, @original_filename="tohu.jpg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"recipe[image]\"; filename=\"tohu.jpg\"\r\nContent-Type: image/jpeg\r\n">, "calorie"=>"100", "sugar"=>"4.0"} permitted: false>, "name"=>{"0"=>"豆腐", "1"=>"ねぎ"}, "amount"=>{"0"=>"1/2", "1"=>"少々"}, "number"=>{"0"=>"1", "1"=>"2"}, "process"=>{"0"=>"豆腐切る", "1"=>"ねぎ切る"}, "commit"=>"投稿する", "controller"=>"recipes", "action"=>"create"} permitted: false>

recipe_params[:name]を実行するとnilが返ってきました。

pry(#<RecipesController>)> recipe_params[:name] => nil

ストロングパラメーターの記述が間違えていると考えましたが、どう試してもうまくいきません。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

自己解決

ストロングパラメーターではなくjQueryの問題でした!
name属性を使わないと、動的フォームの最後の値のみデータベースに保存されます。
検証で見てみると、cloneしたフォームとされたフォーム全てのnameが同じだった為であることが分かりました。
name属性を使わないときに番号を振れるよう考えています!

投稿2020/05/24 03:19

na22ky

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問