2013-07-25 37 views
11

Trong ứng dụng Rails của tôi, tôi cho phép người dùng tải lên hình ảnh khi họ tạo "bản phát hành" và nó sẽ tải trực tiếp lên S3. Tôi nhận được lỗi sau trong cả phát triển và sản xuất."thiếu yêu cầu: tùy chọn thùng" cho Paperclip/S3

EDIT: Tôi nên lưu ý rằng lỗi này xảy ra khi cố tải lên từ trang chỉnh sửa bản phát hành khi gửi biểu mẫu.

ArgumentError in ReleasesController#update 

missing required :bucket option 
Rails.root: /Users/jasondemeuse/pressed 

Tôi đã thực hiện việc này trước đây mà không gặp vấn đề gì khi sử dụng Carrierwave, nhưng không thể hiểu tôi đang làm gì khi sử dụng Paperclip. Tất cả các bản sửa lỗi tôi đã thấy trên SO và ở nơi khác là các vấn đề về heroku, nhưng tôi cũng gặp phải vấn đề tương tự về phát triển và không có bản sửa lỗi nào đã giúp.

Dưới đây là các mã có liên quan ("..." chỉ ra không đoạn có liên quan):

development.rb

Appname::Application.configure do 

... 

    config.paperclip_defaults = { 
    :storage => :s3, 
    :s3_protocol => 'http', 
    :s3_credentials => { 
     :bucket => ENV['AWS_BUCKET'], 
     :access_key_id => ENV['AWS_ACCESS_KEY_ID'], 
     :secret_access_key => ENV['AWS_SECRET_ACCESS_KEY'] 
    } 
    } 
end 

production.rb

Appname::Application.configure do 

... 

    config.paperclip_defaults = { 
    :storage => :s3, 
    :s3_protocol => 'http', 
    :s3_credentials => { 
     :bucket => ENV['AWS_BUCKET'], 
     :access_key_id => ENV['AWS_ACCESS_KEY_ID'], 
     :secret_access_key => ENV['AWS_SECRET_ACCESS_KEY'] 
    } 
    } 
end 

phát hành .rb

class Release < ActiveRecord::Base 
    attr_accessible ... :banner 


    belongs_to :user 


    has_attached_file :banner, styles: { 
    thumb: '100x100>', 
    square: '200x200#', 
    medium: '300x300>', 
    spread: '1200x200' 
    } 

    has_many :banners, :dependent => :destroy 
    accepts_nested_attributes_for :banners, :allow_destroy => true 


end 

show.html.erb

<%= image_tag @release.banner.url(:medium) %> 
<%= @release.banner.url %> 

// Have both of these in for now to see if they work, but since the upload isn't working it's giving me the missing.png 

_form.html.erb

<%= f.label "Add A Banner?" %><br /> 
<%= f.file_field :banner %> 

Heroku cấu hình (có cùng trong .bash_profile cho sự phát triển)

AWS_ACCESS_KEY_ID:   XXXXXXXXXXXXXXXX 
AWS_BUCKET:     appname 
AWS_SECRET_ACCESS_KEY:  XXXXXXXXXXXXXXXXXXXXXXXXXXX 

EDIT: Dưới đây là của tôi phần liên quan của bộ điều khiển của tôi quá

def update 
    @release = Release.find(params[:id]) 


    respond_to do |format| 
     if @release.update_attributes(params[:release]) 
     format.html { redirect_to [@user,@release], notice: 'Release was successfully updated.' } 
     format.json { head :no_content } 
     else 
     format.html { render action: "edit" } 
     format.json { render json: @release.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

Tôi biết điều này nên cực kỳ đơn giản và tôi chắc chắn rằng tôi chỉ quên một cái gì đó rõ ràng, nhưng tôi đã được đi qua this walkthrough cũng như các bản sửa lỗi tôi đã tìm thấy và không có gì có vẻ hiệu quả. Có một nhiệm vụ cào hoặc bó mà tôi quên chạy hay cái gì đó?

Cảm ơn bạn trước!

CHỈNH SỬA 2: Câu trả lời dưới đây đã giúp tôi rất nhiều và chuyển sang đá quý fog cố định hầu hết mọi thứ cho tôi. Chỉ trong trường hợp những người khác đang có những vấn đề tương tự, tôi cũng đã có một vấn đề khác đã làm cho một trong những điều này gây nhầm lẫn cho tôi. Nếu bạn gặp vấn đề về heroku và số Paperclip::PaperclipError (Item model missing required attr_accessor for 'image_file_name'):, hãy đảm bảo bạn chạy heroku rake db:migrate sau đó khởi động lại heroku với heroku restart. Tôi đã tải lược đồ của mình và giả định sai rằng tôi sẽ không cần phải làm điều đó.

Câu trả lời SO với bên trên can be found here.

+0

Bạn đang sử dụng phiên bản kẹp giấy nào? – gregates

+0

3.4.2 - Tôi có kẹp giấy "đá quý" "," ~> 3.0 "trong Gemfile của tôi. – Jason

+0

Tôi đoán một điều cần thử là chạy 'AWS_BUCKET = appname rails server' và xem bạn vẫn gặp lỗi. – gregates

Trả lời

19

Tôi nghĩ rằng đó là vì :bucket phải là một tùy chọn được chuyển đến Paperclip không đến S3.
cố định cấu hình

config.paperclip_defaults = { 
    :storage => :s3, 
    :s3_protocol => 'http', 
    :bucket => ENV['AWS_BUCKET'], 
    :s3_credentials => { 
     :access_key_id => ENV['AWS_ACCESS_KEY_ID'], 
     :secret_access_key => ENV['AWS_SECRET_ACCESS_KEY'] 
    } 
    } 

Paperclip::Storage::S3 doc dường như để khẳng định rằng, thậm chí là rất kém bằng văn bản/định dạng.

EDIT:

Trong một trong những dự án của tôi, tôi sử dụng Kẹp giấy với sương mù đá quý và điều này hoạt động tốt

Paperclip::Attachment.default_options.merge!(
    :storage => :fog, 
    :fog_credentials => { 
    :provider => 'AWS', 
    :aws_access_key_id => ENV['S3_ACCESS_KEY_ID'], 
    :aws_secret_access_key => ENV['S3_SECRET_ACCESS_KEY'], 
    :region => 'eu-west-1' # in case you need it 
    }, 
    :fog_directory => ENV['S3_BUCKET'], # only one of those is needed but I don't remember which 
    :bucket => ENV['S3_BUCKET'] 
) 
+1

Điều đó dường như không thay đổi, tôi đã đưa nó vào s3_credentials theo [heroku walkthrough cho paperclip] (https://devcenter.heroku.com/articles/paperclip-s3). Tôi sẽ xem xét nó nhiều hơn, có lẽ một cái gì đó trong hướng dẫn đó là không chính xác? Cảm ơn bạn đã giúp đỡ! – Jason

+0

Theo ý kiến ​​của tôi, bạn nên gắn với readme của Paperclip không phải là một số hướng dẫn Heroku mà không ai biết bao nhiêu tuổi. –

+0

Nó đã được đăng/cập nhật vào tháng Tư và được viết bởi một nhà phát triển tại Thoughtbot, nhưng vâng tôi cũng đã xem qua readme Paperclip. – Jason

0

Trong trường hợp của tôi nó là tôi đã sử dụng quản đốc (Heroku) trong đó sử dụng một . env tệp để lưu các biến môi trường. Vì vậy, khi tôi đã làm rake db:migrate nó không thể tìm thấy ENV['AWS_ACCESS_KEY_ID']

Tôi đã làm gì để chạy di cư của tôi đã được tôi tạm thời thêm thông tin AWS tôi directlñy vào khối cấu hình Carrierwave và sau đó loại bỏ chúng sau ...

Đây là không phải là một giải pháp lâu dài vì lần sau khi bạn di chuyển nó sẽ nói điều tương tự ...

đối với các giải pháp lâu dài xem: Use environment variables in Rake task

mà nói sử dụng: foreman run rake some_task cách này tất cả các biến được định nghĩa trong .env được nạp cho rake tác vụ quá

0

Thêm tệp này vào tệp application.rb của bạn bên trong mô-đun và lớp học. tạo một tập tin local_env.yml và đặt các biến môi trường của bạn vào đó. Mã này sẽ tải các biến môi trường của bạn trên máy chủ bắt đầu:

config.autoload_paths += %W(#{config.root}/lib) 
config.before_configuration do 
    env_file = File.join(Rails.root, 'config', 'local_env.yml') 
    YAML.load(File.open(env_file)).each do |key, value| 
     ENV[key.to_s] = value 
    end if File.exists?(env_file) 
end 
Các vấn đề liên quan