Ответ 1
:default_url => ActionController::Base.helpers.asset_path('missing_:style.png')
Затем поместите изображения по умолчанию в app/assets/images/
Я использую Paperclip и имею параметр default_url, подобный этому для одного из моих вложений:
:default_url => '/images/missing_:style.png'
Конвейер ресурсов явно не нравится, поскольку каталоги перемещаются. Какой лучший способ справиться с этим? У меня есть два стиля для этого изображения (: mini и: thumb).
:default_url => ActionController::Base.helpers.asset_path('missing_:style.png')
Затем поместите изображения по умолчанию в app/assets/images/
Проверено только на 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
также принимает лямбда, но я не мог найти способ определить запрошенный стиль, поскольку интерполяции применяются только к результату лямбда.
Просто убедитесь, что в ваших представлениях все ваши скрепленные изображения отображаются с помощью image_tag
.
<%= image_tag my_model.attachment.url(:icon) %>
Таким образом, все paperclip :crazy :symbol :interpolation
произойдут с строкой url, прежде чем Rails попытается разрешить ее в актив в конвейере.
Кроме того, убедитесь, что ваш :default_url
совместим с активами... if missing_icon.png находится в приложении/активах/изображениях/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">
Я получил ошибку (даже для одного стиля) в активах: прекомпиляция с
: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
Я не пытался использовать несколько стилей, но это работает для моей ситуации.
это работает для меня:
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
В rails 4.0.0 и paperclip 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' }
В итоге мне пришлось использовать что-то вроде следующего.
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
Я статически собираю активы и получаю ошибку в производстве, это помогло мне.
В файле модели измените эту строку:
has_attached_file :avatar, styles: { medium: "300x300>", thumb: "100x100>" }, default_url: "/images/:style/missing.png"
удалив это:
/images/
Создайте папку для каждого стиля, в этом примере, средний и большой палец, в тестах/изображениях и поместите изображение с именем missing.png(или любое другое имя, которое вы хотите получить, конечно, если оно совпадает с именем файла в модели)
Работал для меня.
Я решил эту проблему, используя пользовательский интерполятор.
Проблема из других решений, которые предполагают использование
: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, ...
Просто удалите /
из /images/pic.png
: images/pic.png