備忘録

覚えておきたい技術とかやりたいこととかやってることとか。

Rails5でnested attribute使うときは気をつけろ

Rails5はモデルまわりの変更が多い気がする。

やりたかったのは、以下のモデルで

class Report < ApplicationRecord
  has_one :operator
  accepts_nested_attributes_for :operator, allow_destroy: true
end

class Operator < ApplicationRecord
  belongs_to :report
end

こんな感じでviewで保存すると、

  <%= f.fields_for :operator, @report.operator || @report.build_operator do |of| %>
    <%= render partial: "operator_form", locals: {of: of } %>
  <% end %>

なぜかバリデーションエラーでDBに保存できなくなる問題。
いや、StrongParameterちゃんと書いてるし、パラメータちゃんと受け取ってるやん・・・。

解決策は、belongs_toにoptionalでtrueを宣言してあげる。
rails5ではデフォルトでfalseになってしまってるみたい。なんなんそれ・・・。

class Operator < ApplicationRecord
  belongs_to :report, optional: true
end