Default_url в Paperclip Broke с обновлением конвейера активов - PullRequest
33 голосов
/ 10 марта 2012

Я использую Paperclip и у меня есть опция default_url для одного из моих вложений:

:default_url => '/images/missing_:style.png'

Конвейеру активов это явно не нравится, так как каталоги перемещены. Какой лучший способ справиться с этим? У меня есть два стиля для этой картинки (: мини и: большой палец).

Ответы [ 10 ]

45 голосов
/ 19 марта 2012
:default_url => ActionController::Base.helpers.asset_path('missing_:style.png')

Затем поместите изображения по умолчанию в app / assets / images /

24 голосов
/ 25 сентября 2013

Проверено только на Rails 4.

Чтобы заставить его работать в рабочей среде, мы должны передать имя существующего файла помощнику asset_path.Поэтому передача строки, содержащей заполнитель типа "missing_:style.png", не работает.Я использовал пользовательскую интерполяцию в качестве обходного пути:

# config/initializers/paperclip.rb
Paperclip.interpolates(:placeholder) do |attachment, style|
  ActionController::Base.helpers.asset_path("missing_#{style}.png")
end

Обратите внимание, что вы должны , а не префикс пути с images/, даже если ваше изображение находится в app/assets/images.Затем используйте его следующим образом:

# app/models/some_model.rb
has_attached_file(:thumbnail,
                  :default_url => ':placeholder',
                  :styles => { ... })

Теперь стандартные URL-адреса с правильными хеш-кодами разыгрываются в производстве.

Опция default_url также принимает лямбду, но я не смог найти способопределить запрошенный стиль, поскольку интерполяции применяются только к результату лямбды.

15 голосов
/ 19 июня 2012

Просто убедитесь, что в ваших представлениях все ваши изображения скрепки отображаются с image_tag.

<%= image_tag my_model.attachment.url(:icon) %>

Таким образом, все скрепки :crazy :symbol :interpolation произойдут со строкой URL-адреса до того, как Rails попытается преобразовать его в ресурс в конвейере.

Кроме того, убедитесь, что ваш :default_url совместим с активами ... если missing_icon.png находится на app / assets / images / missing_icon.png , то :default_url должно быть просто "missing_:style.png"

<%= image_tag my_model.attachment.url(:icon) %>
# resolves to...
<%= image_tag "missing_icon.png" %>
# which in development resolves to...
<img src="/assets/missing_icon.png">
8 голосов
/ 07 сентября 2012

Я получил ошибку (даже для одного стиля) в ресурсах: прекомпилировать с

:default_url => ActionController::Base.helpers.asset_path('missing.png')

Так что я подключил такой метод

# supposing this is for avatar in User model

has_attached_file :avatar,
   :styles => {..},    
   :default_url => lambda { |avatar| avatar.instance.set_default_url}

def set_default_url
  ActionController::Base.helpers.asset_path('missing.png')
end

Я не пробовалдля нескольких стилей, но это работает для моей ситуации.

3 голосов
/ 09 марта 2014

это работает для меня:

has_attached_file :avatar, :styles => { :small => "52x52",
:medium => "200x200>", :large=> "300x300", :thumb => "100x100>" },
                              :default_url => "missing_:style.png"

просто поместите изображения в папку ваших активов / изображений с именем: missing_large.png, missing_medium.png, missing_small.png и missing_thumb.png

2 голосов
/ 16 апреля 2014

В рельсах 4.0.0 и скрепке 4.1.1 у меня это работало:

has_attached_file :avatar,
  styles: { medium: '300x300#', small: '100x100#', thumb: '25x25#' },
  default_url: ->(attachment) { 'avatar/:style.gif' },
  convert_options: { all: '-set colorspace sRGB -strip' }
1 голос
/ 06 октября 2016

В файле модели измените эту строку:

has_attached_file :avatar, styles: { medium: "300x300>", thumb: "100x100>" }, default_url: "/images/:style/missing.png"

, удалив это:

/images/

Создайте папку для каждого стиля, в этом примере - средний и большой, в ассессах/ images и поместите туда изображение с именем missing.png (или любое другое имя, которое вы, конечно, хотите, чтобы оно совпадало с именем файла в модели)

Работало для меня.

1 голос
/ 19 ноября 2014

Мне пришлось использовать что-то вроде следующего.

DEFAULT_URL = "#{Rails.configuration.action_controller.asset_host}#{Rails.configuration.assets.prefix}/:attachment/:style/missing.png"
has_attached_file :art, :styles => { :large => "398x398#", :medium => "200x200#", :small=>"100x100#", :smaller=>"50x50#", :smallest=>"25x25"}, :path=>"images/:attachment/:id/:style/:basename.:extension", :default_url => DEFAULT_URL

Я статически компилировал ресурсы и получал ошибку в работе, это помогло мне.

0 голосов
/ 08 декабря 2014

Просто удалите / из /images/pic.png: images/pic.png

0 голосов
/ 12 января 2014

Я решил эту проблему с помощью пользовательского интерполятора.

Проблема других решений, предлагающих использовать

:default_url => ActionController::Base.helpers.asset_path('missing_:style.png')

, заключается в том, что вы получите сообщение об ошибке «missing_style.png»"предварительно не скомпилировано.

Я создал инициализатор со следующим кодом:

module Paperclip
  module AssetPipeline
    module Interpolator
      def self.interpolate(pattern, *args)
        ActionController::Base.helpers.asset_path Paperclip::Interpolations.interpolate(pattern, *args)
      end
    end
  end
end

Тогда в моей модели я бы сделал:

has_attached_file :image, interpolator: Paperclip::AssetPipeline::Interpolator, ...
...