在
some research之后,我能够根据我的image_class列添加样式.
Model.rb
has_attached_file :image,:styles => lambda { |attachment| attachment.instance.decide_styles } def decide_styles styles = {} case self.image_class when "poster" styles[:thumb] = ["30x45!",:jpg] styles[:standard] = ["185x278!",:jpg] styles[:expanded] = ["372x559!",:jpg] styles[:big] = ["600x900!",:jpg] when "cover" styles[:thumb] = ["30x45!",:jpg] styles[:standard] = ["300x1200!",:jpg] end styles end
这很顺利,现在我也想添加条件convert_options.这种方式失败了.
has_attached_file :image,:styles => lambda { |attachment| attachment.instance.decide_styles },:convert_options => lambda { |attachment| attachment.instance.decide_convert_options } def decide_styles ... end def decide_convert_options opshunz = {} case self.image_class when "poster" opshunz[:thumb] = "-flop" opshunz[:standard] = "-flop" opshunz[:expanded] = "-flop" opshunz[:big] = "-flop" when "cover" opshunz[:thumb] = "-enhance" opshunz[:standard] = "-enhance" end opshunz end
错误:
NoMethodError: undefined method `instance' for :all:Symbol from /Users/AnsPoluke/Sites/nulike/app/models/movie_image.rb:8:in `block in <class:MovieImage>' from /Users/AnsPoluke/.rvm/gems/ruby-2.1.0/gems/paperclip-4.1.1/lib/paperclip/attachment.rb:431:in `[]' from /Users/AnsPoluke/.rvm/gems/ruby-2.1.0/gems/paperclip-4.1.1/lib/paperclip/attachment.rb:431:in `process_options' from /Users/AnsPoluke/.rvm/gems/ruby-2.1.0/gems/paperclip-4.1.1/lib/paperclip/attachment.rb:423:in `extra_options_for' from /Users/AnsPoluke/.rvm/gems/ruby-2.1.0/gems/paperclip-4.1.1/lib/paperclip/style.rb:56:in `convert_options' from /Users/AnsPoluke/.rvm/gems/ruby-2.1.0/gems/paperclip-4.1.1/lib/paperclip/style.rb:79:in `block in processor_options' from /Users/AnsPoluke/.rvm/gems/ruby-2.1.0/gems/paperclip-4.1.1/lib/paperclip/style.rb:78:in `each' from /Users/AnsPoluke/.rvm/gems/ruby-2.1.0/gems/paperclip-4.1.1/lib/paperclip/style.rb:78:in `processor_options' from /Users/AnsPoluke/.rvm/gems/ruby-2.1.0/gems/paperclip-4.1.1/lib/paperclip/attachment.rb:462:in `block in post_process_style' from /Users/AnsPoluke/.rvm/gems/ruby-2.1.0/gems/paperclip-4.1.1/lib/paperclip/attachment.rb:461:in `each' from /Users/AnsPoluke/.rvm/gems/ruby-2.1.0/gems/paperclip-4.1.1/lib/paperclip/attachment.rb:461:in `inject' from /Users/AnsPoluke/.rvm/gems/ruby-2.1.0/gems/paperclip-4.1.1/lib/paperclip/attachment.rb:461:in `post_process_style' from /Users/AnsPoluke/.rvm/gems/ruby-2.1.0/gems/paperclip-4.1.1/lib/paperclip/attachment.rb:454:in `block in post_process_styles' from /Users/AnsPoluke/.rvm/gems/ruby-2.1.0/gems/paperclip-4.1.1/lib/paperclip/attachment.rb:453:in `each' from /Users/AnsPoluke/.rvm/gems/ruby-2.1.0/gems/paperclip-4.1.1/lib/paperclip/attachment.rb:453:in `post_process_styles' from /Users/AnsPoluke/.rvm/gems/ruby-2.1.0/gems/paperclip-4.1.1/lib/paperclip/attachment.rb:445:in `block (2 levels) in post_process' from /Users/AnsPoluke/.rvm/gems/ruby-2.1.0/gems/activesupport-4.0.2/lib/active_support/callbacks.rb:393:in `_run__3861360263242897910__image_post_process__callbacks' from /Users/AnsPoluke/.rvm/gems/ruby-2.1.0/gems/activesupport-4.0.2/lib/active_support/callbacks.rb:80:in `run_callbacks' from /Users/AnsPoluke/.rvm/gems/ruby-2.1.0/gems/paperclip-4.1.1/lib/paperclip/callbacks.rb:36:in `run_paperclip_callbacks' from /Users/AnsPoluke/.rvm/gems/ruby-2.1.0/gems/paperclip-4.1.1/lib/paperclip/attachment.rb:443:in `block in post_process' from /Users/AnsPoluke/.rvm/gems/ruby-2.1.0/gems/activesupport-4.0.2/lib/active_support/callbacks.rb:383:in `_run__3861360263242897910__post_process__callbacks' from /Users/AnsPoluke/.rvm/gems/ruby-2.1.0/gems/activesupport-4.0.2/lib/active_support/callbacks.rb:80:in `run_callbacks' from /Users/AnsPoluke/.rvm/gems/ruby-2.1.0/gems/paperclip-4.1.1/lib/paperclip/callbacks.rb:36:in `run_paperclip_callbacks' from /Users/AnsPoluke/.rvm/gems/ruby-2.1.0/gems/paperclip-4.1.1/lib/paperclip/attachment.rb:442:in `post_process' from /Users/AnsPoluke/.rvm/gems/ruby-2.1.0/gems/paperclip-4.1.1/lib/paperclip/attachment.rb:114:in `assign' from /Users/AnsPoluke/.rvm/gems/ruby-2.1.0/gems/paperclip-4.1.1/lib/paperclip/has_attached_file.rb:66:in `block in define_setter' from (irb):2 from /Users/AnsPoluke/.rvm/gems/ruby-2.1.0/gems/railties-4.0.2/lib/rails/commands/console.rb:90:in `start' from /Users/AnsPoluke/.rvm/gems/ruby-2.1.0/gems/railties-4.0.2/lib/rails/commands/console.rb:9:in `start' from /Users/AnsPoluke/.rvm/gems/ruby-2.1.0/gems/railties-4.0.2/lib/rails/commands.rb:62:in `<top (required)>' from bin/rails:4:in `require'
任何想法为什么它与样式完美配合但转换失败?
解决方法
注意:尚未验证工作代码
似乎传入块的参数:convert_options已经是一个实例,而不是附件(而不是样式选项,它是一个附件)
尝试:
convert_options: lambda { |instance| instance.decide_convert_options }
has_attached_file :image,styles: lambda { |attachment| attachment.instance.image_options[:styles] },convert_options: lambda { |instance| instance.image_options[:convert_options] } IMAGE_OPTIONS = { poster: { styles: { thumb: ["30x45!",:jpg],standard: ["185x278!",expanded: ["372x559!",:jpg] big: ["600x900!",:jpg] },convert_options: { thumb: "-flop",standard: "-flop",expanded: "-flop",big: = "-flop" } },cover: { styles: { thumb: ["30x45!",standard: ["300x1200!",convert_options: { thumb: "-enhance",standard: "-enhance" } } } def image_options IMAGE_OPTIONS[self.image_class] end
我希望有所帮助
更新:
看起来你的convert_options没有在这里设置:
https://github.com/thoughtbot/paperclip/blob/a93dfc773b4fd649db4d1281b42a2a71b1ae72ff/lib/paperclip/style.rb#L55
看起来他们建议传递带有样式的convert_options,如本规范:https://github.com/thoughtbot/paperclip/blob/263a498195d47563a6227be18cf4463c4c6e7903/spec/paperclip/style_spec.rb#L41
你能试试吗?所以完全删除convert_options,并在您的配置中返回哈希,如:
IMAGE_OPTIONS = { poster: { styles: { thumb: { geometry: "30x45!",format: :jpg,convert_options: '-flop',},standard: {...} expanded: {...} big: {...} } },cover: { styles: {...}