0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

[Rails] [devise] ActiveStorage使用時にupdateで「ActiveRecord::RecordNotSaved - Failed to save the new associated preference」が発生するとき

Posted at

問題

ログイン機能にdeviseを使用しており、UserにActiveRecordで画像を添付して新規登録・編集できるような実装を行いました。
すると、registrations#update(編集)の際に

ActiveRecord::RecordNotSaved - Failed to save the new associated preference

が発生してしまいました。

以下そのときの対処を書きます。

対処

まずdeviseのregistrations#updateは以下となります。

devise/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)
    yield resource if block_given?

    (以下略)

  end

Railsガイドによると、既存のUserに画像を添付する際はuser.image.attachをしなければいけないとのことなので、
その操作を以下のようにはさみました。(users/registrations_controllerでオーバライドしてます)
以下のコメント部分です。

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_updatedattachの順番を変えたらエラーが出なくなりました。

devise/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.image.attach(account_update_params[:image])
    resource_updated = update_resource(resource, account_update_params)

    yield resource if block_given?

    (以下略)

  end

おわり

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?