2012-02-20 9 views
5

Tôi có một thùng S3 để sản xuất và phát triển. Tôi đã thực hiện nghiên cứu của mình và came across this post nhưng cấu hình hiện tại của tôi không hoạt động như mong đợi. Tôi nhận được ngoại lệ sau (phía dưới) tại địa phương và tôi không nhận được tập tin tải lên xô S3 của tôi từ ứng dụng Heroku tôi:howto: Thiết lập cơ bản của sóng mang [Heroku và S3]

is not a recognized storage provider 
Extracted source (around line #3): 

1: 
2: <p><%= user.name %></p> 
3: <%= image_tag user.avatar.url %> 
4: <%= link_to 'Show', user %> 
5: <%= link_to 'Edit', edit_user_path(user) %> 
6: <%= link_to 'Destroy', user, confirm: 'Are you sure?', method: :delete %> 

Tuy nhiên Khi tôi đặt storage :file bên trong của tập tin *_uploader.rb mọi thứ hoạt động như mong đợi tại địa phương. Nhưng vẫn còn lưu ý bao giờ được gửi đến thùng S3 của tôi.

Dưới đây là bộ của tôi lên:

user.rb

class User < ActiveRecord::Base 
attr_accessible :name, :avatar, :avatar_cache, :remote_avatar_url, :remove_avatar 
mount_uploader :avatar, AvatarUploader 
end 

fog.rb

CarrierWave.configure do |config| 
    if Rails.env.production? 
    config.storage = :fog 
    config.fog_credentials = { 
    :provider    => 'AWS', 
    :aws_access_key_id  => ENV['S3_K'], 
    :aws_secret_access_key => ENV['S3_SCRT'], 
    :region    => ENV['S3_RG'] 
    } 
    config.fog_directory = ENV['S3_BUCKET'] 
    config.fog_host  = 'http://www.example.com' 
    config.fog_public  = true         # optional, defaults to true 
    config.fog_attributes = {'Cache-Control' => 'max-age=315576000'} # optional, defaults to {} 

else 
#for development and testing locally 
    config.storage = :file 
    config.enable_processing = false 
end 
end 

* _uploader.rb

class AvatarUploader < CarrierWave::Uploader::Base 

storage :fog 

def store_dir 
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" 
end 

def extension_white_list 
    %w(jpg jpeg gif png) 
end 

end 

users_controller.rb

def new 
@user = User.new 
@user.avatar = params[:file] 
    respond_to do |format| 
    format.html # new.html.erb 
    format.json { render json: @user } 
    end 
end 

def create 
@user = User.new(params[:user]) 
@user.avatar = params[:file] 
    respond_to do |format| 
    if @user.save 
    format.html { redirect_to @user, notice: 'User was successfully created.' } 
    format.json { render json: @user, status: :created, location: @user } 
    else 
    format.html { render action: "new" } 
    format.json { render json: @user.errors, status: :unprocessable_entity } 
    end 
end 

cuối

CẬP NHẬT Nhờ @ CanBerkGüder tôi có thể xác nhận rằng tôi có thể lưu các bản ghi nhưng không phải là tập tin hình ảnh. Bất cứ khi nào tôi cố gắng tạo đối tượng người dùng, nhật ký heroku của tôi phun ra:

2012-02-20T23:19:45+00:00 app[web.1]: app/controllers/users_controller.rb:46:in `block in create' 
2012-02-20T23:19:45+00:00 app[web.1]: app/controllers/users_controller.rb:45:in `create' 
2012-02-20T23:19:45+00:00 app[web.1]: 
2012-02-20T23:19:45+00:00 app[web.1]: cache: [POST /users] invalidate, pass 
+1

Hai điều cần kiểm tra: 1. là đá quý 'sương mù' được liệt kê trong Gemfile của bạn? 2. Nếu có, hãy thử chỉ định config.storage =: fog trong bộ khởi tạo. –

+0

@ CanBerkGüder Tôi cập nhật trình khởi tạo của mình và vẫn không có may mắn, vui lòng xem phần CẬP NHẬT cho những gì đã xảy ra sau khi tôi cập nhật. – rhodee

+0

Cấu trúc thư mục không quan trọng, như các tài liệu nói, đơn giản vì không có thư mục trên S3 (nó chỉ là một tập tin có tên uploads/user/avatar/1/2_48x48.png). Rất tiếc, tôi không thể nghĩ ra lý do thứ ba có thể gây ra lỗi mà bạn đang gặp phải. –

Trả lời

1

OK, đây là một ý tưởng. CarrierWave vẫn bao gồm một bộ điều hợp S3 cho khả năng tương thích ngược sử dụng sương mù bên dưới, mà cá nhân tôi sử dụng thay vì :fog. Về lý thuyết, không nên có sự khác biệt giữa hai, nhưng tôi nghĩ nó đáng để bắn. Dưới đây là CarrierWave initializer của tôi từ một ứng dụng chạy trên live Heroku:

CarrierWave.configure do |config| 
    if Rails.env.production? 
    config.root = Rails.root.join('tmp') 
    config.cache_dir = 'carrierwave' 

    config.storage = :s3 
    config.s3_access_key_id = ENV['S3_KEY'] 
    config.s3_secret_access_key = ENV['S3_SECRET'] 
    config.s3_bucket = ENV['S3_BUCKET'] 
    else 
    config.storage = :file 
    end 
end 

Hai dòng đầu tiên (config.root và config.cache_dir) đều có mặt để làm việc xung quanh Heroku của hệ thống tập tin chỉ đọc, mà nên không có gì để làm gì với vấn đề của bạn.

+0

Tôi đã xem bản cập nhật hai dòng trong tài liệu, cảm ơn vì đã nhắc tôi. Bộ điều khiển của tôi nên trông như thế nào? Tôi có phải thêm một dòng như '@user.avatar = params [: file] 'vào trong các hành động' mới' và 'tạo' của tôi không? – rhodee

+0

Câu trả lời của bạn không hoạt động trong thiết lập của tôi, nhưng nó chắc chắn đã truyền cảm hứng cho một số nghiên cứu về phía tôi! Cảm ơn bạn. – rhodee

+0

@rhodee xin lỗi khi biết nó không hoạt động. không có gì. –

0

Một vấn đề có thể là

config.fog_host  = 'http://www.example.com' 

Nếu bạn sử dụng thiết lập này, bạn có thể cần một máy chủ thực sự ở đó. Giả sử bạn có thể nhận xét rằng dòng ra, mặc dù tôi đã nhìn thấy nó rất khuyến khích.

Và tôi giả sử bạn đặt các biến ENV của bạn trên Heroku?

heroku config:add S3_K=[my_s3_key] S3_SCRT=[my_s3_secret] S3_RG=[us-east-1]S3_BUCKET=[my_bucket_name] 

Tôi đã sử dụng khá nhiều thiết lập tương tự. Tôi không làm việc, nhưng tôi nghĩ tôi có thêm một hoặc hai bước:

Missing required arguments: aws_access_key_id, aws_secret_access_key