問題点
ActiveStorageを利用してファイルをアップロードする際に「undefined method `upload' for nil:NilClass」エラーが発生する
再現手順
- アプリをRails 5.0から5.2へバージョンアップ
-
rails active_storage:install
とrails db:migrate
を実行してActiveStorageをインストール - Mode, Controller, Viewにファイルアップロードに必要な設定を追記
- ブラウザからファイルアップロード操作を行うと問題点に記載したエラーが発生
原因
- ActiveStorageを利用するために必要な設定が不足していた
解決方法
environments/*.rb にコンフィグを追記
config/environments/development.rb
# Store uploaded files on the local file system (see config/storage.yml for options)
config.active_storage.service = :local
config/environments/test.rb
# Store uploaded files on the local file system (see config/storage.yml for options)
config.active_storage.service = :test
config/environments/production.rb
# Store uploaded files on the local file system (see config/storage.yml for options)
config.active_storage.service = :local
storage.ymlを追加
config/storage.yml
test:
service: Disk
root: <%= Rails.root.join("tmp/storage") %>
local:
service: Disk
root: <%= Rails.root.join("storage") %>
# Use rails credentials:edit to set the AWS secrets (as aws:access_key_id|secret_access_key)
# amazon:
# service: S3
# access_key_id: <%= Rails.application.credentials.dig(:aws, :access_key_id) %>
# secret_access_key: <%= Rails.application.credentials.dig(:aws, :secret_access_key) %>
# region: us-east-1
# bucket: your_own_bucket
# Remember not to checkin your GCS keyfile to a repository
# google:
# service: GCS
# project: your_project
# credentials: <%= Rails.root.join("path/to/gcs.keyfile") %>
# bucket: your_own_bucket
# Use rails credentials:edit to set the Azure Storage secret (as azure_storage:storage_access_key)
# microsoft:
# service: AzureStorage
# storage_account_name: your_account_name
# storage_access_key: <%= Rails.application.credentials.dig(:azure_storage, :storage_access_key) %>
# container: your_container_name
# mirror:
# service: Mirror
# primary: local
# mirrors: [ amazon, google, microsoft ]
補足
追記した設定、作成したyamlについてはRails 5.2でアプリを新規作成した時にデフォルトで作成される設定ファイルを参考にした