web-dev-qa-db-ja.com

AWS S3の統合により、未定義のメソッド「match」が生成されます

Paperclipを使用して画像をアップロードする簡単なプロジェクトに取り組んでいます。 S3をPaperclipと統合しようとするまで、すべてがうまく機能しています。ユーザーの画像を「アップロード」すると、NoMethodError (undefined method 'match' for nil:NilClass):エラーが発生します。これは、S3構成を実行している場合にのみ発生します。コメントアウトすると、ファイルのアップロードが完全に完了します。

私の構成:

development.rb:
....
....
  config.Paperclip_defaults = {
  :storage => :s3,
  :s3_credentials => {
    :bucket => ENV['AWS_BUCKET_ID'],
    :access_key_id => ENV['AWS_ACCESS_KEY_ID'],
    :secret_access_key => ENV['AWS_SECRET_ACCESS_KEY']
  }
}

私のモデル:

 class User < ActiveRecord::Base
        has_attached_file :image_file, default_url: "/myapp/images/:style/missing.png"
        validates_attachment_file_name :image_file, matches: [/png\Z/, /jpeg\Z/, /tiff\Z/, /bmp\Z/, /jpg\Z/]

コンソールからのエラー出力全体:

NoMethodError (undefined method `match' for nil:NilClass):
  app/controllers/images_controller.rb:33:in `block in create'
  app/controllers/images_controller.rb:32:in `create'

私が試したもの:

  • AWSキーとバケット名を環境変数としてではなく、コードに直接追加しました。

  • 上記のように、環境ファイルのAWS構成をコメント化したところ、完全に機能しているようでした。

Google Cloud Storageの構成を開始するためにfog gemを先にインストールしたことを言及する価値はありますが、代わりにS3を使用することにしました。 gem uninstall fogはgemを削除しますが、一部の依存関係が残っているようです。

20
PSCampbell

追加 :s3_regionを設定マップに:

例えば。

config.Paperclip_defaults = {
  :storage => :s3,
  :s3_credentials => {
    :bucket => ENV['AWS_BUCKET_ID'],
    :access_key_id => ENV['AWS_ACCESS_KEY_ID'],
    :secret_access_key => ENV['AWS_SECRET_ACCESS_KEY']
  },
  :s3_region => ENV['AWS_REGION']
}

残念ながら、これはv5.0.0の機能です(ベータ版)。したがって、ドキュメントにはそれについて何もありません。しかし 実際の5.0コードにそれについてのコメント があります。

s3_permissions papertrailのキーは文字列値を期待します(これは記号を受け入れるために使用されていました)。

:s3_permissions => 'public-read'
37
rguerrettaz

s3_credentialsなどの方法で、region: ENV["AWS_REGION"]でリージョンを指定する必要があります。未使用の宝石のクリーンアップについては、bundle cleanを実行できます。

3
Yimanei