22

次のような人物のアバターに URL を返すメソッドを持つモデルがあります。

 def avatar_url
   if self.avatar?
     self.avatar.url # This uses paperclip
   else
     "/images/avatars/none.png"
   end
 end

私は 3.1 にアップグレード中なので、ハードコーディングされた none 画像をアセット パイプラインから参照する必要があります。コントローラーまたはビューでは、 でラップするだけimage_path()ですが、モデルにはそのオプションがありません。画像への正しい URL を生成するにはどうすればよいですか?

4

5 に答える 5

20

しばらくの間、これを正しく行うのに苦労したので、ここに回答を投稿すると思いました。上記は標準の既定の画像 (つまり、各クリップ スタイルに同じもの) に対して機能しますが、複数の既定のスタイルが必要な場合は、別のアプローチが必要です。

デフォルトの URL をアセット パイプラインとアセットの同期でうまく機能させ、スタイルごとに異なるデフォルトの画像が必要な場合は、フィンガープリントなしでアセット パスを生成する必要があります。そうしないと、多くの AssetNotPrecompiled エラーが発生します。

そのようです:

   :default_url => ActionController::Base.helpers.asset_path("/missing/:style.png", :digest => false)

またはあなたのペーパークリップのオプションで:

   :default_url => lambda { |a| "#{a.instance.create_default_url}" }

次に、ペーパークリップが添付されたモデルのインスタンス メソッド:

def create_default_url
   ActionController::Base.helpers.asset_path("/missing/:style.png", :digest => false)
end

この場合、補間 (:style) を引き続き使用できますが、アセットのフィンガープリンティング/ダイジェストをオフにする必要があります。

ダイジェストを含むアセットだけでなく、ダイジェストを含まないアセットも同期している限り、これはすべてうまくいくようです。

于 2012-10-24T16:22:44.060 に答える
9

個人的には、ビューの詳細であるため、このデフォルトをモデルに入れる必要はないと思います。あなたの(haml)ビューで:

= image_tag(@image.avatar_url || 'none.png')

または、独自のヘルパーを作成し、次のように使用します。

= avatar_or_default(@image)

レールでこのようなことが困難な場合、それは多くの場合、それが正しくないことを示しています。

于 2011-09-01T08:24:55.227 に答える
6

draper: https://github.com/jcasimir/draperを使用してこの問題を解決しました。Draper を使用すると、ヘルパーにアクセスできる (ビューで使用するための) モデルの周りにラッパーを追加できます。

于 2011-09-19T21:17:55.587 に答える