問題
ログイン機能にdevise
を使用しており、User
にActiveRecordで画像を添付して新規登録・編集できるような実装を行いました。
すると、registrations#update(編集)
の際に
ActiveRecord::RecordNotSaved - Failed to save the new associated preference
が発生してしまいました。
以下そのときの対処を書きます。
対処
まずdeviseのregistrations#update
は以下となります。
def update
self.resource = resource_class.to_adapter.get!(send(:"current_#{resource_name}").to_key)
prev_unconfirmed_email = resource.unconfirmed_email if resource.respond_to?(:unconfirmed_email)
resource_updated = update_resource(resource, account_update_params)
yield resource if block_given?
(以下略)
end
Railsガイド
によると、既存のUserに画像を添付する際はuser.image.attachをしなければいけない
とのことなので、
その操作を以下のようにはさみました。(users/registrations_controllerでオーバライドしてます)
以下のコメント部分です。
def update
self.resource = resource_class.to_adapter.get!(send(:"current_#{resource_name}").to_key)
prev_unconfirmed_email = resource.unconfirmed_email if resource.respond_to?(:unconfirmed_email)
resource_updated = update_resource(resource, account_update_params)
# resource.image.attach(account_update_params[:image])
yield resource if block_given?
(以下略)
end
すると、ActiveRecord::RecordNotSaved - Failed to save the new associated preference
が発生してしまいました。
解決方法
理由は単純で、resource_updated
でupdateした後にattach
していたので、
resource_updated
とattach
の順番を変えたらエラーが出なくなりました。
def update
self.resource = resource_class.to_adapter.get!(send(:"current_#{resource_name}").to_key)
prev_unconfirmed_email = resource.unconfirmed_email if resource.respond_to?(:unconfirmed_email)
# 順番を変えた
resource.image.attach(account_update_params[:image])
resource_updated = update_resource(resource, account_update_params)
yield resource if block_given?
(以下略)
end
おわり