Module: Technoweenie::AttachmentFu::ActMethods
- Defined in:
- lib/technoweenie/attachment_fu.rb
Instance Method Summary collapse
-
#has_attachment(options = {}) ⇒ Object
-
:keep_profile
By default image EXIF data will be stripped to minimize image size.
-
-
#setup_attachment_fu(extra_opts = {}, config_filename = nil) ⇒ Object
helper method for has_attachment, for if you want to set up stuff from a yaml file.
Instance Method Details
#has_attachment(options = {}) ⇒ Object
-
:keep_profile
By default image EXIF data will be stripped to minimize image size. For small thumbnails this proivides important savings. Picture quality is not affected. Set to false if you want to keep the image profile as is. ImageScience will allways keep EXIF data.
Examples:
:max_size => 1.kilobyte
:size => 1.megabyte..2.megabytes
:content_type => 'application/pdf'
:content_type => ['application/pdf', 'application/msword', 'text/plain']
:content_type => :image, :resize_to => [50,50]
:content_type => ['application/pdf', :image], :resize_to => 'x50'
:thumbnails => { :thumb => [50, 50], :geometry => 'x50' }
:storage => :file_system, :path_prefix => 'public/files'
:storage => :file_system, :path_prefix => 'public/files',
:content_type => :image, :resize_to => [50,50]
:storage => :file_system, :path_prefix => 'public/files',
:thumbnails => { :thumb => [50, 50], :geometry => 'x50' }
:storage => :s3
:storage_key => 'store',
:backends => { 's3' => { :storage => :s3, :path_prefix => 'foo', :max_size => 5.kilobyte, :default => true },
'local1' => { :storage => :file_system, :path_prefix => 'data/public' } }
104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 |
# File 'lib/technoweenie/attachment_fu.rb', line 104 def ( = {}) # this allows you to redefine the acts' options for each subclass, however [:min_size] ||= 1 [:max_size] ||= 1.megabyte [:size] ||= ([:min_size]..[:max_size]) [:thumbnails] ||= {} [:thumbnail_class] ||= self [:s3_access] ||= :private [:cloudfront] ||= false [:store_name] ||= :default [:content_type] = [[:content_type]].flatten.collect! { |t| t == :image ? Technoweenie::AttachmentFu.content_types : t }.flatten unless [:content_type].nil? unless [:thumbnails].is_a?(Hash) raise ArgumentError, ":thumbnails option should be a hash: e.g. :thumbnails => { :foo => '50x50' }" end extend ClassMethods unless (class << self; included_modules; end).include?(ClassMethods) include InstanceMethods unless included_modules.include?(InstanceMethods) attr_accessor :thumbnail_resize_options = || {} self. = # doing these shenanigans so that #attachment_options is available to processors and backends [:storage] ||= ([:file_system_path] || [:path_prefix]) ? :file_system : :db_file [:storage] ||= [:storage] [:path_prefix] ||= [:file_system_path] if [:path_prefix].nil? [:path_prefix] = case [:storage] when :s3 then table_name when :cloud_files then table_name when :mogile_fs then table_name else File.join("public", table_name) end end [:path_prefix] = [:path_prefix][1..-1] if [:path_prefix].first == '/' = { :foreign_key => 'parent_id' } if [:association_options] .merge!([:association_options]) end () do |m| m.has_many :thumbnails, :class_name => "::#{[:thumbnail_class]}" m.belongs_to :parent, :class_name => "::#{base_class}" unless [:thumbnails].empty? end self. ||= {} storage_klass_name = case [:storage] when :mogile_fs "MogileFS" else [:storage].to_s.classify end storage_klass = Technoweenie::AttachmentFu::Backends.const_get("#{storage_klass_name}Backend") self.[[:store_name]] = {:klass => storage_klass, :options => } storage_klass.included_in_base(self) # support syntax-sugar of "a = Attachment.new ; a.s3.authenticated_s3_url" for accessing store-specific stuff self.class_eval "def #{[:store_name]}; get_storage_delegator(:#{[:store_name]}); end" case [:processor] when :none, nil processors = Technoweenie::AttachmentFu.default_processors.dup begin if processors.any? [:processor] = processors.first processor_mod = Technoweenie::AttachmentFu::Processors.const_get("#{[:processor].to_s.classify}Processor") include processor_mod unless included_modules.include?(processor_mod) end rescue Object, Exception raise unless ($!) processors.shift retry end else begin processor_mod = Technoweenie::AttachmentFu::Processors.const_get("#{[:processor].to_s.classify}Processor") include processor_mod unless included_modules.include?(processor_mod) rescue Object, Exception raise unless ($!) puts "Problems loading #{[:processor]}Processor: #{$!}" end end unless [:processor] # Don't let child override processor end |
#setup_attachment_fu(extra_opts = {}, config_filename = nil) ⇒ Object
helper method for has_attachment, for if you want to set up stuff from a yaml file
197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 |
# File 'lib/technoweenie/attachment_fu.rb', line 197 def (extra_opts = {}, config_filename = nil) config_file ||= Rails.root.join("config/attachments.yml").to_s raise "No attachment_fu configuration found, tried #{config_file}" unless File.exist?(config_file) att_opts = YAML.load(ERB.new(File.read(config_file)).result)[Rails.env] raise "No attachment_fu configuration found for environment #{Rails.env}" unless att_opts arr = att_opts[self.name.tableize] || att_opts[:default] raise "No attachment_fu configuration found for table #{self.name.tableize}" unless arr arr = [arr] if arr.is_a?(Hash) # both flavors! arr.each do |val| = val.symbolize_keys.merge(extra_opts) [:thumbnails] = [:thumbnails].symbolize_keys if [:thumbnails] [:store_name, :storage].each { |k| [k] = .delete(k).to_sym if [k] } end end |