2012-06-17 4 views
0

Im пытается настроить хранилище Amazon S3 с помощью скрепки в моем приложении rails.Рельсы: AWS S3 + Скрепка: Получение NoMethodError в AssetsController # create

У меня есть модель под названием «Asset», которая принадлежит к «Пользователю»

Вот первые несколько строк в Asset.rb

attr_accessible :user_id, :uploaded_file 

belongs_to :user 
#set up "uploaded_file" filed as attached_file(using paperclip) 
has_attached_file :uploaded_file, 
       :path => "assets/:id/:basename.:extension", 
       :storage => :s3, 
       :s3_credentials => "#{Rails.root}/config/amazon_s3.yml", 
       :bucket => "XXXXX" 

validates_attachment_size :uploaded_file, :less_than => 1000.megabytes 
validates_attachment_presence :uploaded_file 

Im получая ошибку, когда я загружаю вид:

NoMethodError in AssetsController#create 
undefined method `symbolize_keys' for #<String:0x00000103939258> 

Что это значит. это что-то делать с этой линией в «Asset.rb» : s3_credentials => «# {} Rails.root /config/amazon_s3.yml»,

Я посмотрел в Интернете и там было несколько дискуссий на как Rails_ROOT был устаревшим, поэтому вместо этого я использовал Rails.root. Все еще получаю эту ошибку.

Также я сохраняю ключ AWS и секретный пароль в файле конфигурации amazon_s3.yml.

Это не лучшая практика, поэтому, если у кого-нибудь есть другие идеи, я бы с удовольствием их услышал. heroku говорит на своем веб-сайте, чтобы помещать переменные в качестве переменных окружения, однако я не уверен, как бы это установить на геройку, а также о том, когда Im на моей локальной машине разработки? Как это будет работать?

Я просто немного смущен, поэтому смотрю, есть ли где-то полный пример или учебник. Все, что я мог найти, были устаревшими настройки .....

Благодаря

+0

Что трассировку/место, где вы создать вызов? –

ответ

2

Как это работает для меня (принято к вашей ситуации):

#Asset.rb 
has_attached_file :uploaded_file, { 
    :path => "assets/:id/:basename.:extension" 
}.merge(PAPERCLIP_STORAGE_OPTIONS) 

#environments/development.rb and test.rb 
PAPERCLIP_STORAGE_OPTIONS = { 
    :storage => :s3, 
    :bucket => "XXXX", 
    :s3_credentials => YAML.load_file("#{Rails.root}/config/s3_credentials.yml") 
} 

#environments/production.rb 
PAPERCLIP_STORAGE_OPTIONS = { 
    :storage => :s3, 
    :bucket => ENV['S3_BUCKET_NAME'], 
    :s3_credentials => { 
    :access_key_id => ENV['AWS_ACCESS_KEY_ID'], 
    :secret_access_key => ENV['AWS_SECRET_ACCESS_KEY'] 
    } 
} 

#config/s3_credentials.yml 
access_key_id: "XXXX" 
secret_access_key: "XXXX" 

Обратите внимание

  1. Добавить s3_credetials.yml в .gitignore.
  2. Убедитесь, вы добавили ENV переменные в Heroku: https://devcenter.heroku.com/articles/s3
  3. Вы можете изменить значение PAPERCLIP_STORAGE_OPTIONS к { }. Затем файлы будут храниться локально (например, для тестов).

Этот вопрос помог мне в решении проблем: How can I set paperclip's storage mechanism based on the current Rails environment?

Не по теме, но это может быть полезно: если вы хотите, чтобы прочитать файл - @asset.uploaded_file.s3_object.read

+0

Привет, спасибо за этот отличный ответ. У меня есть вопрос: у меня есть эта строка в моей среде «environment/development.rb»: «Paperclip.options [: command_path] =«/usr/local/bin/»« Должен ли я добавить вашу предложенную строку: «PAPERCLIP_STORAGE_OPTIONS = . {......} после этой строки или заменить его Спасибо – banditKing

+0

Это не сработало Im получает эту ошибку « Routing Error неинициализированных постоянных активов :: PAPERCLIP_STORAGE_OPTIONS» – banditKing

+0

Добавить до или после того, как:. не имеет значения Я только что перепроверил: для меня это работает. Вы пытались перезапустить сервер?Убедитесь, что вы указали одно и то же имя константы в конфигурации, или какую среду вы запускаете, или где вы вставляете конфигурацию ... Стандартный процесс отладки. Но я не знаю, почему вы получаете «ошибку маршрутизации». Странно, может быть, ошибка здесь. –

Смежные вопросы