LoginSignup
lj3368
@lj3368 (Tero)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

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

1Answer

自己解決しました。
Itemモデルのバリデーションのsheet_id(presence: true)がない状態なら保存できました。

保存するタイミングが同時だからsheet_idがまだ付与されていない?
と考えているのですが、presence: trueのバリデーションをかけたい場合は何か他の方法があるのでしょうか。

0Like

Your answer might help someone💌