🖼️

Active Storageはどやさ (EOTD No.11)

2020/12/22に公開

こちらAmetaです。第11回目のError Of The Dayはこちらです!

本日のエラー

シチュエーション

昨日実装したWizard形式の実装の続きをしていた時に起きたエラーです。

https://zenn.dev/swata_dev/articles/6ffb694cc1d8b7

今回はDeviseを用いてウィザード形式でユーザーの新規登録を設定しようとしていました。

新規登録1ページ目の情報を保存する"Chefs"テーブルとそれに続く2ページ目の情報を保存する"profiles"テーブル。

この2つのモデルには以下のようなアソシエーションを記述。

#models/profile.rb
  belongs_to :chef, optional: true
#models/chef.rb
  has_one :profile
  has_one_attached :image

ルーティングは以下のように設定。

#routes.rb
  devise_for :users, controllers: {
    sessions: 'users/sessions',
    passwords: 'users/passwords',
    registrations: 'users/registrations'
  }

  devise_for :chefs, controllers: {
    sessions: 'chefs/sessions',
    passwords: 'chefs/passwords',
    registrations: 'chefs/registrations'
  }

  devise_scope :chefs do
    get 'profiles', to: 'chefs/registrations#new_profile'
    post 'profiles', to: 'chefs/registrations#create_profile'
  end

"image"がunkown attributeって?

考察

今回一度ユーザー管理機能を管理した後にこの画像投稿機能を付け加えたのでデータベースの同期をする必要があると気付きました。

rails active_storage:install
rails db:rollback
rails db:migrate

でActive Storageをデータベースに反映することができました!
ただエラーは解決せず、同じエラーが発生。

改めてエラー文を眺めてみると。

ActiveModel:UnknownAttributeError (unknown attribute "image" for profile.):

ActiveModel?

モデルに関係しているエラーなのかもしれない。。
そう思い、モデルのchef.rbとprofile.rbをチェックしました。

解決

修正後のファイルがこちらです。

#models/profile.rb
  belongs_to :chef, optional: true
  has_one_attached :image
#models/chef.rb
  has_one :profile

アソシエーションで画像投稿のために設定していたhas_one_attached :imageを実際に添付が行われるprofile.rbの方ではなく、chef.rbの方に設定していたようです。

SOTD(Summary Of The Day)

wizard形式での実装に慣れていないこともあって、どこに問題が生じているのかを見つけ出すのが少し難しいと感じました。

また今回のように一度実装し終わった機能に改めてカラムを追加したい場合にどの部位を修正する必要があるかと言うことを再確認することができました。今日の学びです。。

Discussion