Изображения, не связанные должным образом (несущая волна, туман, heroku)


Пытаюсь добавить загрузку изображений на основе несущей волны в мою пользовательскую модель. Это работает локально в развитии. На heroku изображение загружается в мою корзину s3, но никогда не отображается. В консоли, похоже, не было загружено ни одного изображения.

Если изображение попадает в s3, почему оно не ассоциируется должным образом?

Вот код:

# config/initializers/carrierwave.rb
CarrierWave.configure do |config|

  if Rails.env.production?
    config.fog_credentials = {
      provider:              'AWS',               # required
      aws_access_key_id:     ENV['S3_KEY'],       # required
      aws_secret_access_key: ENV['S3_SECRET']     # required
    }

    config.fog_directory  = ENV['S3_BUCKET']      # required
    config.fog_public     = false                 # optional, defaults to true
    config.fog_attributes = {
      'Cache-Control'=>'max-age=315576000'
    }

    config.storage = :fog
  else
    config.storage = :file
  end

end

# app/uploaders/profile_picture_uploader.rb
class ProfilePictureUploader < CarrierWave::Uploader::Base

  def store_dir
    "uploads/#{ model_name }/#{ mounted_as }/#{ model.id }"
  end

  def cache_dir
     Rails.root.join *%w[ tmp uploads model_name ]
  end

  def extension_white_list
    %w[ jpg jpeg gif png ]
  end

private

  def model_name
    @model_name ||= model.class.to_s.underscore
  end

end

# app/models/user.rb
class User < ActiveRecord::Base

  mount_uploader :profile_picture, ProfilePictureUploader

  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable, :confirmable

  attr_accessible :email, :password, :password_confirmation, :profile_picture

end

# app/views/users/edit.html.haml
%h1 Edit user

= form_for @user do |f|

  %h2 Profile Picture
  - if f.object.profile_picture.present?
    = image_tag f.object.profile_picture
    %p= f.object.profile_picture.file.basename

    = f.check_box :remove_profile_picture
    = f.label :remove_profile_picture, 'Delete your Profile Picture'

    = f.label :profile_picture, 'Replace your Profile Picture'
  - else
    = f.label :profile_picture, 'Add your Profile Picture'
  = f.file_field :profile_picture

  %p
    = f.submit 'Save'
    or
    = link_to 'cancel', @user

Платформа:

  • рельсы 3.1.0
  • carrierwave 0.5.7
  • Heroku cedar stack
1 2

1 ответ:

Все еще не совсем уверен Почему это работает, но я добавил метод к моей модели

def profile_picture_file_name
  read_attribute :profile_picture_file
end

И использовать этот метод, на мой взгляд, вместо

f.object.profile_picture.file.basename

И все теперь счастливы.

Благодаря отображению имени файла Carrierwave в представлении .