Images not associated properly (carrier wave, fog, heroku)
Trying to add carrier wave based image uploading to my user model. This works locally in development. On heroku, the image is uploaded to my s3 bucket, but never displayed. In the console, it looks like no image was uploaded.
If the image is making it to s3, why isn't it being associated properly?
Here's the code:
# 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'
开发者_如何学JAVA
= 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
Platform:
- rails 3.1.0
- carrierwave 0.5.7
- heroku cedar stack
Still not entirely sure why this works, but I added a method to my model
def profile_picture_file_name
read_attribute :profile_picture_file
end
and use that method in my view instead of
f.object.profile_picture.file.basename
And everything is happy now.
Thanks to Displaying a Carrierwave filename in the view.
精彩评论