🖼️
Active Storageはどやさ (EOTD No.11)
こちらAmetaです。第11回目のError Of The Dayはこちらです!
本日のエラー
シチュエーション
昨日実装したWizard形式の実装の続きをしていた時に起きたエラーです。
今回は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