cocoonで保存ができない
解決したいこと
Ruby on Railsでcocoonを使用してスキルマップを作成する機能をつくっています。
当初formオブジェクトで実装していたところをcocoonに変更しています。
フォームの追加や削除はできますが、保存がうまくできません。
公式を参考にフォームを作り直しましたが、変化ありませんでした。
sheets(親)1
- id
- user_id
- title
items(子)多
- id
- sheet_id
- text
確認したこと
createの中でpry-railsで確認したところ下記のようなエラーを確認できました。
[6] pry(#<SheetsController>)> @sheet.valid?
=> false
[7] pry(#<SheetsController>)> @sheet.errors.full_messages
=> ["Items sheetを入力してください"]
[8] pry(#<SheetsController>)>
=> ["Items sheetを入力してください"]
とありますが、@sheetの中身は入っているようでした。
[9] pry(#<SheetsController>)> @sheet
=> #<Sheet:0x00007faee24d2c20 id: nil, user_id: 5, title: "私のスキルマップ", created_at: nil, updated_at: nil>
[10] pry(#<SheetsController>)> @sheet.items
=> [#<Item:0x00007faede4298b8 id: nil, sheet_id: nil, text: "Rubyの基礎をマスターする", created_at: nil, updated_at: nil>,
#<Item:0x00007faeeaa9c8b0 id: nil, sheet_id: nil, text: "PHPの基礎をマスターする", created_at: nil, updated_at: nil>,
#<Item:0x00007faeeaaa7030 id: nil, sheet_id: nil, text: "HTMLの基礎をマスターする", created_at: nil, updated_at: nil>]
[11] pry(#<SheetsController>)>
↓ 保存できなかった時のターミナル
User Load (0.4ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 5 ORDER BY `users`.`id` ASC LIMIT 1
(0.2ms) BEGIN
↳ app/controllers/sheets_controller.rb:17:in `create'
User Load (1.7ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 5 LIMIT 1
↳ app/controllers/sheets_controller.rb:17:in `create'
(0.3ms) ROLLBACK
↳ app/controllers/sheets_controller.rb:17:in `create'
↓ sheetsコントローラー
class SheetsController < ApplicationController
def new
@sheet = Sheet.new
@items = @sheet.items.build
end
def create
@sheet = Sheet.new(sheet_params)
if @sheet.save
redirect_to action: :index
flash[:info] = "スキルマップを登録しました。"
else
render :new
end
end
private
def sheet_params
params.require(:sheet).permit(:title,
items_attributes:[:id, :text, :_destroy]).merge(user_id: current_user.id)
end
end
↓ sheetモデル
class Sheet < ApplicationRecord
with_options presence: true do
validates :user_id
validates :title, length: { maximum: 40 }
end
belongs_to :user
has_many :items, inverse_of: :sheet, dependent: :destroy
accepts_nested_attributes_for :items, allow_destroy: true
end
↓ itemモデル
class Item < ApplicationRecord
with_options presence: true do
validates :sheet_id
validates :text, length: { maximum: 100 }
end
belongs_to :sheet
end
コントローラーの
.merge(user_id: current_user.id)
これが公式にはなかったため、余計だったかと思い外してみたりしましたが、user_idがなくなるだけでした。
何か見落としや思い違いなどがあれば、ご指摘いただきたいです。
どうぞよろしくお願いいたします。
0