回形针:样式别名

时间:2012-08-31 12:57:46

标签: ruby-on-rails paperclip

有没有办法在回形针中定义样式别名(相同的转换,相同的文件路径)?

# in the model
has_attached_file :image, {
  :styles => {
    :thumb => "90x90>",
    :small => :thumb
  }
  [...]
}

# in the application
model.image.url(:thumb)
=> 'path/to/image/thumb.jpg'

model.image.url(:small)
=> 'path/to/image/thumb.jpg'

我目前正在重构一个有很多重复样式的应用程序。我希望将它定义一次,同时不破坏界面。

2 个答案:

答案 0 :(得分:3)

这是一个在初始化程序中添加的补丁:

module Paperclip
  Options.class_eval do
    attr_accessor :aliases

    def initialize_with_alias(attachment, hash)
      @aliases = hash[:aliases] || {}
      initialize_without_alias(attachment, hash)
    end

    alias_method_chain :initialize, :alias
  end

  Attachment.class_eval do
    def url_with_patch(style_name = default_style, use_timestamp = @options.use_timestamp)
      style_name = @options.aliases[style_name.to_sym] if @options.aliases[style_name.to_sym]
      url_without_patch(style_name, use_timestamp)
    end

    alias_method_chain :url, :patch
  end
end

以这种方式使用:

has_attached_file :image, {
  :styles => {
    :thumb => "90x90>"
  }
  :aliases => { :small => :thumb }
}

答案 1 :(得分:0)

我对apneadiving代码进行了一些更改以在版本~ 4中运行。

module Paperclip
  Attachment.class_eval do
    def url_with_filter_aliases(style_name = default_style, options = {})
      style_name = find_alias(style_name) if find_alias(style_name).present?
      url_without_filter_aliases(style_name, options)
    end

    alias_method_chain :url, :filter_aliases

    private

    def find_alias(style_name)
      return if @options.blank?

      @options.dig(:aliases, style_name)
    end
  end
end

以相同的方式使用它:

has_attached_file :image, {
  :styles => {
    :thumb => "90x90>"
  }
  :aliases => { :small => :thumb }
}
相关问题