usersテーブル
Column | Type | Options |
---|---|---|
encrypted_password | string | null: false |
string | null: false, unique:true | |
nick_name | string | null: false |
recipesテーブル
Column | Type | Options |
---|---|---|
title | string | null: false |
image | string | null: false |
user | references | foreign_key: true |
materialsテーブル
Column | Type | Options |
---|---|---|
material_name | string | null: false |
quantity_name | string | null: false |
material_id | integer | null: false |
recipe | references | null: 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]
という値を試してみましたがどれもうまくいきませんでした
他の方法を模索しながら回答を待ちます
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。