備忘録

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

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

Rails5におけるdevise_parameter_sanitizer.forエラー

deviseではデフォルトでemailとpasswordの値しか保存できないが、applicationコントローラに以下メソッドを追加してあげるとよい。

class ApplicationController < ActionController::Base
  before_action :configure_permitted_parameters, if: :devise_controller?
  # なんらかの処理

  private
  def configure_permitted_parameters
      devise_parameter_sanitizer.permit(:sign_up, keys: [:name])
  end
end

ちなみにこれはrails5での処理。
rails4までだと

      devise_parameter_sanitizer.permit(:sign_up, keys: [:name])

のところを

      devise_parameter_sanitizer.for(:sign_up) << :name

と書くらしい。

Rails5で「forってメソッドしらん!」と怒られたのでメモ。