2015-07-09 5 views
0

У меня есть продукт Rails ActiveModel с колонкой Paperclip image attachment, которая должна получить его image.url из 2 источников. Один из них - старое ведро S3/CloudFront, другое - наше новое ведро S3/CloudFront. У них совершенно разные учетные данные.Динамический url скрепки скрепки?

Если «instance Product.image_file_name» содержит «старые», я хочу, чтобы URL-адрес был чем-то вроде cloudfront_url/products/file_name, если это не так - он должен использовать новый ведро S3/CloudFront. Загрузка будет происходить только на новом ведре S3, но она будет отложена на старой, если image_file_name содержит old:, как я уже упоминал.

В настоящее время я уполномочен только на новый ковш S3, а не на старый.

Я прочитал, что я должен сделать что-то вроде:

class Product 
     has_attached_file: :image, url: dynamic_url_method 

     def dynamic_url_method 
     .... do some logic based on image_file_name 
     return constructed_url 
     end 
    end 

Однако, когда я делаю это, я получаю неопределенную локальную переменную dynamic_url_method.

Если я оберну его в лямбда, как указано в https://stackoverflow.com/a/10493048, я получаю Error "no implicit conversion of Proc into String".

Успешно ли вы получили Paperclip для работы с динамическим URL? Если вы знаете, как это сделать, это будет спасать жизнь.

+0

Это должен быть символ: 'has_attached_file:: изображение, URL:: dynamic_url_method', вы пропустили двоеточие. Что немного беспокоит, так это то, что лямбда должна работать. Не могли бы вы вставить stacktrace ошибки, которую вы получаете? – BroiSatse

ответ

0

Полностью отбросить всю идею динамического URL-параметра, заданного в приложении «Скрепка». Это ломает загрузку изображения S3, потому что Paperclip не может определить, какой URL использовать.

Решение состоит в том, чтобы ввести новый столбец в вашей схеме под названием image_url. Столбец будет обновляться при инициализации/обновлении в ActiveModel и использоваться на веб-страницах.

В коде

class Product 
    has_attached_file: :image 
    after_create :update_image_url 
    after_update :update_image_url 

    def update_image_url 
    new_image_url = # some logic based on image_file_name that would either return the CloudFront URL or save the URL from image.url which is generated by Paperclip 
    # Paperclip does not update image_file_name_changed? so we can't say 
    # after_create or after_update if: image_file_name_changed? instead 
    # we have to manually check that image_url and new_image_url are different 
    update(image_url: new_image_url) if image_url != new_image_url 
    end 
end 
Смежные вопросы