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

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

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

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

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

Q&A

解決済

1回答

1091閲覧

gem cocoonを使用したフォームで子テーブルに値を保存したい

kengoal

総合スコア1

Ruby on Rails 6

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

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

0グッド

0クリップ

投稿2021/01/26 13:25

usersテーブル

ColumnTypeOptions
encrypted_passwordstringnull: false
emailstringnull: false, unique:true
nick_namestringnull: false

recipesテーブル

ColumnTypeOptions
titlestringnull: false
imagestringnull: false
userreferencesforeign_key: true

materialsテーブル

ColumnTypeOptions
material_namestringnull: false
quantity_namestringnull: false
material_idintegernull: false
recipereferencesnull: false, foreign_key: true
## コントローラーrecipes
```ruby
class RecipesController < ApplicationController
before_action :set_recipe, only: [:show, :edit, :update, :destroy]

def index
@recipes = Recipe.all
end

def show
end

def new
@recipe = Recipe.new
@material = @recipe.materials.build
end

def edit
end

def create

@recipe = Recipe.new(recipe_params) respond_to do |format| if @recipe.save format.html { redirect_to @recipe, notice: 'Recipe was successfully created.' } format.json { render :show, status: :created, location: @recipe } else format.html { render :new } format.json { render json: @recipe.errors, status: :unprocessable_entity } end end

end

def update
respond_to do |format|
if @recipe.update(recipe_params)
format.html { redirect_to @recipe, notice: 'Recipe was successfully updated.' }
format.json { render :show, status: :ok, location: @recipe }
else
format.html { render :edit }
format.json { render json: @recipe.errors, status: :unprocessable_entity }
end
end
end

def destroy
@recipe.destroy
respond_to do |format|
format.html { redirect_to recipes_url, notice: 'Recipe was successfully destroyed.' }
format.json { head :no_content }
end
end

private
actions.
def set_recipe
@recipe = Recipe.find(params[:id])
end

def recipe_params params.require(:recipe).permit(:title, :image, materials_attributes: [:id, :material_name, :quantity_name, :material_id, :recipe_id, :_destroy]).merge(user_id: current_user.id) end

end

##vies recipes/_form.html.erb ```ruby <%= form_with(model: @recipe, local: true) do |f| %> <% if recipe.errors.any? %> <div id="error_explanation"> <h2><%= pluralize(recipe.errors.count, "error") %> prohibited this recipe from being saved:</h2> <ul> <% recipe.errors.full_messages.each do |message| %> <li><%= message %></li> <% end %> </ul> </div> <% end %> <div class="clear_content"> <div class="clear_left_content"> <div class="field"> <%= f.label :title %> <%= f.text_field :title %> </div> <div> <%= f.label :image, for:"message_image", class:"fa fa-camera fa-3x" do %> <%= f.file_field :image, id:"message_image", style: "display: none;" %> <div id="image-list"></div> <% end %> </div> </div> </div> </div> <h3>材料</h3> <div id="materials"> <%= f.fields_for :materials do |t| %> <%= render 'material_fields',f: t %> <% end %> <div id="links"> <%= link_to_add_association 'add material',f, :materials %> </div> <div class="actions"> <%= f.submit %> </div> <% end %>

##vies recipes/_material_fields.html.erb

iv

1 <div class="form-group"> 2 <%= f.label :material_name %> 3 <%= f.text_field :material_name %><br> 4 </div> 5 <%= f.label :quantity_name %> 6 <%= f.text_field :quantity_name %><br> 7 </div> 8 <%= link_to_remove_association "削除", f %> 9</div>

##各モデル表記

ruby

1--userモデル 2devise :database_authenticatable, :registerable, 3 :recoverable, :rememberable, :validatable 4 5 PASSWORD_REGEX = /\A(?=.*?[a-z])(?=.*?[\d])[a-z\d]+\z/i.freeze 6 validates_format_of :password, with: PASSWORD_REGEX, message: 'には英字と数字の両方を含めて設定してください' 7 8 with_options presence: true do 9 validates :nickname 10 validates :email,:password,:password_confirmation 11 end 12 13 has_many :recipes 14 15--recipeモデル 16belongs_to :user 17 mount_uploader :image, ImageUploader 18 has_many :materials,dependent: :destroy 19 accepts_nested_attributes_for :materials, reject_if: :all_blank, allow_destroy: true 20 validates :title, presence: true 21 validates :image, presence: true 22 validates :user, presence: true 23 24--materialモデル 25 belongs_to :recipe, optional: true 26 validates :material_name, presence: true 27 validates :quantity_name, presence: true 28 validates :material_id, presence: true 29 validates :recipe_id, presence: true

##解決したいこと
cocoonでネストフォームを作成中です
フォームの必要要項を記入して保存しようとしたところ
イメージ説明
とvaridationエラーが出ました
ストロングパラメーターの子テーブルのmaterial_nameとquantitiy_nameは
通っているのでidとmaterial_id関係が通っていないことになるのですが
どうやってidを紐付かせて渡すのか色々試してみましたが解決できず途方にくれています
助言をいただけると幸いです

##調べてみたこと
現状のbinding.pryでは
イメージ説明
idの値がparamsに紐付いていない感じなので
mergeをしたり@recipe.materials = params[:material_id]
という値を試してみましたがどれもうまくいきませんでした
他の方法を模索しながら回答を待ちます

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

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

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

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

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

guest

回答1

0

自己解決

一番の問題だったのはモデルのreject_if: :all_blankのオプションが邪魔をしていたのでこれを削除すること
これは丸コピで自分でも分かっていないオプションを使わないっていう教訓になったかな
後は、テーブルの設計がこの時点で間違っていたことに気づいていなかったこと
テーブルの設計さえきちんと行えばcocoonのフォームは自分の想定したとおりに増やせるし
保存することができる
レシピに紐づく材料があって材料に紐づく調理法があるって捉えたために
長い間苦悩することになった
レシピに紐づくのは材料と調理法で2つはネストする関係じゃなかったんだよな

rails

1materials_attributes: [:id, :material_name, :quantity_name, :material_id, :recipe_id, :_destroy])

:idは主キーのことで外部キーのresipe_idとセットで保存することになる
なので何でここにmaterial_id書いてるのはそらあコンソールに突っ込まれますよね
まあ今とはなってはテーブル設計自体がおかしいということに帰結しますので
現状はやっとかねてからの問題が解決したので閉じさせていただきます

投稿2021/02/27 13:13

kengoal

総合スコア1

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問