3

I deployed Rails 5 app local with paperclip attachments: all was working fine. Only on heroku I need AWS s3 and it does not work with Rails 5.0.1/paperclip 5.1.0/aws-sdk 2.7.3.

Has anybody a working configuration for storing attachments on s3?

This is my models/article.rb:

class Article < ApplicationRecord
  has_many :comments, dependent: :destroy
  validates :title, presence: true,
                length: { minimum: 5 }
  has_attached_file :attachment,
            :url => ":s3_domain_url",
            #:path => ':filename',
            :storage => :s3,
            :bucket => ENV['AWS_BUCKET'],
            :s3_bucket => ENV['AWS_BUCKET'],
            :s3_permissions => :private,
            :s3_protocol => 'http',
            :s3_host_name => 's3.amazonaws.com',
            #:s3_host_alias => 's3.amazonaws.com',
            :s3_region => ENV['AWS_REGION'],
            #:region => ENV['AWS_REGION'],
            :s3_credentials => { :access_key_id => ENV['AWS_ACCESS_KEY_ID'],
                                 :secret_access_key => ENV['AWS_SECRET_KEY_ID'],
                                 :endpoint => 's3.amazonaws.com' }

  # Explicitly do not validate
  do_not_validate_attachment_file_type :attachment
  #validates_attachment :attachment, content_type: { content_type: 'application/x-java-archive'}, size: { in: 0..10.megabytes }
end

The environment variables are set to:

AWS_ACCESS_KEY_ID=....
AWS_BUCKET=....
AWS_REGION=us-east-1
AWS_SECRET_KEY_ID=....

The articles_controller is:

class ArticlesController < ApplicationController

  http_basic_authenticate_with name: "gerrit", password: "_tVo1I44iyLe", except: [:index, :show]

  def index
    @articles = Article.all
  end

  def show
    @article = Article.find(params[:id])
  end



def new
  @article = Article.new
end

def edit
  @article = Article.find(params[:id])
end

def create
  @article = Article.new(article_params)

  if @article.save
    redirect_to @article
  else
    render 'new'
  end
end

def update
  @article = Article.find(params[:id])

  if @article.update(article_params)
    redirect_to @article
  else
    render 'edit'
  end
end

def destroy
  @article = Article.find(params[:id])
  @article.destroy

  redirect_to articles_path
end

private
  def article_params
    #article_params =
    params.require(:article).permit(:title, :text, :attachment)
    #@article.update_attributes( article_params )
  end
end

This is the error I have now locally and on heroku, next to many others before:

uninitialized constant Paperclip::Storage::S3::AWS Extracted source (around line #26):

  @article = Article.new(article_params)

  if @article.save #line 26
    redirect_to @article
  else
    render 'new'

Parameters:

{"utf8"=>"✓", "authenticity_token"=>"snGgVwA5tqQTPHXwXW1Fx/lmLMS1bL+94jF68KQh031gpX2N78gOK45hCP8w71ObFo6moHQuJXxNnUW0bCUeVw==",
 "article"=>
  {"title"=>"test1",
   "text"=>"",
   "attachment"=>
    #<ActionDispatch::Http::UploadedFile:0x007f46c00881e0
     @content_type="application/x-desktop",
     @headers="Content-Disposition: form-data; name=\"article[attachment]\"; filename=\"Antichamber.desktop\"\r\n" + "Content-Type: application/x-desktop\r\n",
     @original_filename="Antichamber.desktop",
     @tempfile=#<File:/tmp/RackMultipart20170306-5350-esbhtd.desktop>>},
 "commit"=>"Create Article"}

For convenience I add the URL to the broken Rails 5 app here:

gmr-heroku

Everything is working fine now!

NB: You want me to pose different questions and not adding to the original question. Now you don't want duplicate answers.

Leder
  • 396
  • 1
  • 5
  • 21
  • I have an easy solution, but may not give it as an answer here. You can find it in the other question [paperclip git answer](https://stackoverflow.com/questions/41957664/rails-5-on-heroku-forgets-files-stored-with-paperclip-and-turbolinks-no-route-m) – Leder Sep 24 '18 at 07:47

1 Answers1

2

:url => :s3_domain_url should be :url => ":s3_domain_url"

jyurek
  • 1,099
  • 1
  • 9
  • 15
  • With this change and `:s3_permissions => 'public-read',` I get `NameError in ArticlesController#create uninitialized constant Paperclip::Storage::S3::AWS` at the position `if @article.save`. I do not know why `AWS` is mentioned, becaus I use aws-sdk V2.7.7 and that has namespace `Aws`? I tried aws-sdk-v1 to no avail... – Leder Feb 13 '17 at 14:59
  • updated the config file for implementing current answer – Leder May 31 '17 at 09:11