Динамическое использование: default_url в папке
Я пытаюсь настроить Paperclip для предоставления различных недостающих изображений на основе атрибута категории экземпляра. Каждая категория объекта имеет собственное недостающее изображение.
Это мой первый прием:
EDIT, чтобы добавить полные модели:
class Service < ActiveRecord::Base
attr_accessible :logo, :logo_file_name, :logo_content_type, :logo_file_size, :logo_updated_at
belongs_to :category, :counter_cache => true
has_attached_file :logo,
:path => "/:id-:style-:filename",
:url => ":s3_eu_url",
:default_url => "/logos/:style/#{self.category.name]}.png",
:styles => { :large => "600x400>",
:medium => "300x200>",
:small => "100x75>",
:thumb => "60x42>" }
end
class Category < ActiveRecord::Base
attr_accessible nil
has_many :services
end
На мой взгляд, image_tag service.logo.url(:thumb)
выводит:
undefined method `category' for #<Class:0x0000010a731620>
Любые идеи?
EDIT2:
Рабочий файл default_url :default_url => "/logos/:style/missing.png",
РЕШЕНИЕ:
См. мой собственный ответ ниже.
Ответы
Ответ 1
Я нашел решение, после этот смысл и этот другой fooobar.com/questions/524542/....
Мое рабочее решение:
Class Service
has_attached_file :logo,
:path => "/:id-:style-:filename",
:url => ":s3_eu_url",
:default_url => :set_default_url_on_category,
:styles => { :large => "600x400>",
:medium => "300x200>",
:small => "100x75>",
:thumb => "60x42>" }
private
def set_default_url_on_category
"/logos/:style/#{category.name}.png"
end
end
И инициализатор paperclip_default_url_fix.rb
module Paperclip
module Interpolations
def self.interpolate(pattern, *args)
pattern = args.first.instance.send(pattern) if pattern.kind_of? Symbol
all.reverse.inject(pattern.dup) do |result, tag|
result.gsub(/:#{tag}/) do |match|
send(tag, *args)
end
end
end
end
end
Ответ 2
В wiki paperclip есть хорошее чистое решение для : url, : путь и : default_url, который работает соском.
https://github.com/thoughtbot/paperclip/wiki/Interpolations
Ответ 3
Вы можете передать Proc as: default_url для скрепки. См. https://github.com/thoughtbot/paperclip/blob/master/lib/paperclip/attachment.rb#L135. Скрепка будет вызывать это proc с объектом Attachment в качестве параметра. Объект Attachment имеет экземпляр accessor, который является экземпляром объекта ActiveRecord, к которому он привязан. В вашем случае вы должны:
has_attached_file :logo,
:path => "/:id-:style-:filename",
:url => ":s3_eu_url",
:default_url => lambda { |attach| "/logos/:style/#{attach.instance.category.name]}.png },
:styles => { :large => "600x400>",
:medium => "300x200>",
:small => "100x75>",
:thumb => "60x42>" }
Ответ 4
Вам не нужно self
:
:default_url => "/logos/:style/#{category.name}.png",