6

私は (大まかに) RailsCasts チュートリアル #182に従っています。このチュートリアルでは、Paperclip、ImageMagick、および Jcrop を使用して、アップロードされた画像のカスタム トリミングを許可しています。

私はファイル ストレージに Amazon S3 を使用しているため、チュートリアルの一部を調整する必要がありました。私の画像のトリミングされたバージョンが再処理されていない (またはその再処理の結果が S3 に再アップロードされていない) という事実を除いて、すべてが完全に機能しているようです。最初にアップロードしたのと同じ画像 (これは、各画像に保存するすべての画像サイズに当てはまります)。

これが私の機能(機能画像のように)モデルです:

class Feature < ActiveRecord::Base
  require "#{Rails.root}/lib/paperclip_processors/cropper.rb"

  attr_accessible    :image_file_name, :image
  attr_accessor      :crop_x, :crop_y, :crop_w, :crop_h
  after_update       :reprocess_image, :if => :cropping?

  if Rails.env == "production"
  S3_CREDENTIALS = { :access_key_id     => '<REDACTED>',
                     :secret_access_key => '<REDACTED>',
                     :bucket            => "<REDACTED>"}
  else
  S3_CREDENTIALS = { :access_key_id     => '<REDACTED>',
                     :secret_access_key => '<REDACTED>',
                     :bucket            => "<REDACTED>"}
  end

  has_attached_file :image,
                    :styles          => { :small => "240x135>", :croppable => "960x960>", :display => "960x540>" },
                    :processors      => [:cropper],
                    :storage         => :s3,
                    :s3_credentials  => S3_CREDENTIALS,
                    :path            => "features/:id/:style.:extension"

  validates_attachment_content_type :image, :content_type => ['image/jpeg', 'image/gif', 'image/png',
                                                              'image/pjpeg', 'image/x-png'], 
                                            :message => 'must be a JPEG, GIF or PNG image'

  def cropping?
    !crop_x.blank? && !crop_y.blank? && !crop_w.blank? && !crop_h.blank?
  end

  def image_geometry(style = :original)
    @geometry ||= {}
    path = (image.options[:storage]==:s3) ? image.url(style) : image.path(style)
    @geometry[style] ||= Paperclip::Geometry.from_file(path)
  end

  private

  def reprocess_image
    image.reprocess!
  end
end

これが私の 'cropper.rb' (ペーパークリップ プロセッサ) です。

module Paperclip
  class Cropper < Thumbnail
    def transformation_command
      if crop_command
        crop_command + super.sub(/ -crop \S+/, '')
      else
        super
      end
    end

    def crop_command
      target = @attachment.instance
      if target.cropping?
        " -crop '#{target.crop_w}x#{target.crop_h}+#{target.crop_x}+#{target.crop_y}'"
      end
    end
  end
end

私の FeaturesController の関連アクション:

class FeaturesController < ApplicationController

  def new
    @feature = Feature.new
  end

  def create
    @feature = Feature.new(params[:feature])
    if @feature.save
      if params[:feature][:image].blank?
        flash[:notice] = "New feature added!"
        redirect_to @feature
      else
        render :crop
      end
    else
      @title = "Add a New Feature"
      render :new
    end
  end

  def edit
    @feature = Feature.find(params[:id])
    @title = "Edit #{@feature.headline}"
  end

  def update
    @feature = Feature.find(params[:id])
    if @feature.update_attributes(params[:feature])
      if params[:feature][:image].blank?
        flash[:notice] = "Feature updated!"
        redirect_to @feature
      else
        render :crop
      end
    else
      @title = "Edit Feature"
      render :edit
    end
  end
end

そして、私の「crop.html.erb」ビューの関連行:

<% content_for :javascript_includes do %>
    <%= javascript_include_tag 'jquery.Jcrop.min' %>
    <script type="text/javascript" charset="utf-8">
    $(function() {
        $('#cropbox').Jcrop({
            onChange: update_crop,
            onSelect: update_crop,
            setSelect: [0, 0, 960, 540],
            aspectRatio: 960/540
        });
    });

    function update_crop(coords) {
        var ratio = <%= @feature.image_geometry(:original).width %> / <%= @feature.image_geometry(:croppable).width %>;
        $("#crop_x").val(Math.round(coords.x * ratio));
        $("#crop_y").val(Math.round(coords.y * ratio));
        $("#crop_w").val(Math.round(coords.w * ratio));
        $("#crop_h").val(Math.round(coords.h * ratio));
    };
    </script>
<% end %>
<% content_for :style_includes do %>
    <%= stylesheet_link_tag 'jquery.Jcrop', :media => 'screen' %>
<% end %>

<%= image_tag @feature.image.url(:croppable), :id => "cropbox" %>

<% form_for @feature do |f| %>
    <% for attribute in [:crop_x, :crop_y, :crop_w, :crop_h] %>
        <%= f.hidden_field attribute, :id => attribute %>
    <% end %>
    <p><%= f.submit "Crop" %></p>
<% end %>

問題は、カスタム トリミング (オフセット、トリミング領域など) にエラーがあることではなく、[トリミング] をクリックしてもトリミングが行われないことです。元の画像から取得した画像が残っているだけです。アップロード/処理。「image.reprocess!」は表示されません。まったく発生しています (または、再処理の結果が S3 に保存されていません)。

それはなぜでしょうか?どうすればよいでしょうか?

4

3 に答える 3

3

これが同じかどうかはわかりませんが、再処理に問題があり、こちらの回答に従って修正しました:

Rails 3のアップグレード後の再処理中のペーパークリップエラー

于 2012-03-01T16:45:12.897 に答える
2

わかりました、お手伝いさせてください:)

まず、Paperclip プロセッサをモデルに含めないでください。Paperclip に処理させてください。

次に、 を取り外して、プロセッサ用にセットアップする必要がある:after_updateと交換します。プロセッサで、これを試してください::before_updateimage.options[ :crop ]

def initialize file, options = {}, attachment = nil
  super
  #......

  @crop = options[ :crop ]

  #......

transformation_command第三に、プロセッサで次のように変更します。

def transformation_command
  if @crop
      trans = " -quality 75"
      trans << " -crop \"#{<YOUR_CODE>}\" +repage" if @crop
      trans
  end
end

そして、あなたの発見を投稿してください:)

于 2011-09-05T09:56:18.050 に答える
0

また、同じ RailsCast ビデオを使用して、クロッピングを機能させることができました。NOSUCHKEYエラーで同様の問題が発生していましたが、再処理を追跡できました! after_update と呼ばれていた呼び出し。Vishの回答を使用して変更することで、問題を解決できました。毎回トリミングするため、私のソリューションはあなたが必要としているものとはまったく異なる場合があります。

再処理するための after_update 呼び出しを単純に削除しました! 他のすべてを所定の位置に残しました。これにより、渡されたプロセッサ (この場合はクロッパー) がデフォルトの代わりに使用され、画像を S3 にアップロードする前に発生します。初めてアップロードする前にファイルをトリミングするので、すべてが機能します!

条件付きクロッピングが必要な場合は、変数を設定するか、before_update で画像オブジェクトにオプションを渡すという Vish の提案を実行する必要があります。その値に基づいて条件付きクロッピング ロジックを配置できるように、カスタム プロセッサで使用できるようにする必要があります。

于 2011-09-18T02:47:55.503 に答える