Предоставление переменной строки для модели для изменения размера Paperclip Imagemagik - PullRequest
2 голосов
/ 19 октября 2011

Я использую скрепку для загрузки изображений, размер которых изменяется. Один из которых я хочу обрезать одним из пяти способов ... Во всяком случае, я решил, как должны выглядеть все строки для обрезки, изменив их вручную, но теперь мне нужно сделать эту динамику, чтобы скрепка могла обрезаться на основе на то, что хочет пользователь ...

Проблема в том, что я получаю

undefined local variable or method `params' for #<Class:0x00000105b228d8>

Я почти уверен, что это потому, что я пытаюсь согнуть рельсы под свою волю. В любом случае, я думаю, что довольно ясно, что я пытаюсь сделать ... Просто передайте переменную crop_geometry_thumb для convert_options ... Куда мне на самом деле поместить эту логику, чтобы моя модель могла ее найти?

class Asset < ActiveRecord::Base
   if  params[:crop_geometry] == "bottom"
     crop_geometry_thumb = "-crop 200x100+0+100 -scale 100x100"
   elsif  params[:crop_geometry] == "top"
     crop_geometry_thumb = "-crop 200x100+0+0 -scale 100x100"
   elsif  params[:crop_geometry] == "left"
     crop_geometry_thumb = "-crop 100x200+0+100 -scale 100x100"
   elsif  params[:crop_geometry] == "right"
     crop_geometry_thumb = "-crop 100x200+100+0 -scale 100x100"
   else
     crop_geometry_thumb = "-scale 100x100"
   end

  belongs_to :piece
  has_attached_file :asset, :styles => {
    :large => ['700x700', :jpg], 
    :medium => ['300x300>', :jpg], 
    :thumb => ["200x200>", :jpg]},
    :convert_options => {:thumb => crop_geometry_thumb}, ### supply a string from above... FAIL :(
    :path => ":id/:style/:filename",
    :storage => :s3,
    :s3_credentials => "#{RAILS_ROOT}/config/s3.yml",
    :s3_permissions => :private,
    :url => ':s3_domain_url'
end

1 Ответ

3 голосов
/ 19 октября 2011

Таким образом, непосредственная проблема заключается в том, что параметры запроса (т.е. params[:crop_geometry]) не доступны для вашей модели, только для вашего контроллера + представлений.

В некоторых случаях (хотя это никогда не бывает хорошей идеей) вы можете обойти это правило MVC, передав параметры в вашу модель в качестве аргумента для метода:

class FoosController < ApplicationController

  def action
     Foo.some_method(params)
  end
end

class Foo < ActiveRecord::Base

  some_method(params)
     puts params[:crop_geometry]
  end
end

Вместо этогоЯ бы рекомендовал передать эту информацию параметров в переменную экземпляра, определенную в модели, и поместить условную логику в пользовательский метод установки, например, так:

class Asset < ActiveRecord::Base
  attr_reader :crop_geometry

  def crop_geometry=(crop_type)
    if  crop_type == "bottom"
     crop_string = "-crop 200x100+0+100 -scale 100x100"
    elsif  crop_type == "top"
      crop_geometry_thumb = "-crop 200x100+0+0 -scale 100x100"
    elsif  crop_type == "left"
      crop_geometry_thumb = "-crop 100x200+0+100 -scale 100x100"
    elsif  crop_type == "right"
      crop_geometry_thumb = "-crop 100x200+100+0 -scale 100x100"
    else
      crop_geometry_thumb = "-scale 100x100"
    end
    @crop_geometry = crop_geometry_thumb
  end
end

Обратите внимание, что вам придется изменить свою формутак что он присваивает params [: asset] [: crop_geometry] «top», «bottom» или что-то еще.

Теперь, чтобы динамически установить crop_geometry, вам нужно будет использовать лямбду в конфигурации has_attached_file - таким образом, она будет оцениваться при каждом доступе к конфигурации, а не только при начальной загрузке модели.,Вот, пожалуйста:

has_attached_file :asset, :styles => lambda {|attachment|
    :large => ['700x700', :jpg], 
    :medium => ['300x300>', :jpg], 
    :thumb => ["200x200>", :jpg]},
    :convert_options => {:thumb => attachment.instance.crop_geometry},
    :path => ":id/:style/:filename",
    ...
}

Получил последнюю часть из https://github.com/thoughtbot/paperclip (ищите «Динамическая конфигурация»).

...