18

我有一個方法的模型返回一個URL一個人的頭像,看起來像這樣:如何從模型中引用資產管道中的圖像?

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

我在升級之中到3.1,所以現在的硬編碼的圖像基本沒有需求通過資產管道引用。在控制器或視圖中,我只是將它包裝在image_path()中,但我沒有在模型中使用該選項。我怎樣才能生成正確的網址到圖像?

+0

另一種選擇:http://stackoverflow.com/questions/9646549/default-url-in-paperclip-broke-with-asset-pipeline-upgrade – James

回答

6

我們使用過濾器解決了這個問題:https://github.com/jcasimir/draper。 Draper讓我們在我們的模型中添加一個包裝(用於視圖),這些包裝可以訪問助手。

+1

不錯的建議。這顆寶石看起來很有希望。 – lucapette

+0

我相信Draper只是讓它更容易與上面提到的@iain一樣使用幫助器方法。介紹德雷珀只是​​爲了讓你可以訪問幫手是一種矯枉過正,但如果把其他邏輯轉移到主講者是有道理的,那麼一定要 - 去做。 – Lenart

6

就我個人而言,我不認爲你應該真的把這個默認值放在模型中,因爲它是一個視圖細節。在你(HAML)的觀點:

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

或者,創建了自己的助手,並使用它,像這樣:

= avatar_or_default(@image) 

當這樣的事情是很難在導軌,它往往是一個跡象,表明它不完全對。

+3

我經常在json中使用它(通過as_json),它需要遠離那個選項。 –

2

回形針有指定默認網址

has_attached_file :avatar, :default_url => '/images/.../missing_:style.png' 

您可以使用該服務的默認圖像」的情況下,用戶還沒有上傳頭像的選項。

+0

不幸的是,default_url參數也沒有通過資產管道幫助程序進行處理。 –

+13

你可以執行':default_url => ActionController :: Base.helpers.image_path(「/ default_avatar.png」)' – Hengjie

19

我努力爭取一段時間,所以我想我會在這裏發佈答案。雖然上述內容適用於標準默認圖像(即每種回形針樣式都相同),但如果您需要多種默認樣式,則需要採用不同的方法。

如果您希望默認網址能夠與資產管道和資產同步一起播放,並且每種樣式都需要不同的默認圖片,那麼您需要生成沒有指紋的資產路徑,否則您會收到很多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),但必須關閉資產指紋/摘要。

只要您同步不帶摘要的資產和帶摘要的資產,這一切似乎都可以正常工作。

+1

Rails 4,回形針,這不再是必要的。 ':default_url =>「:style/missing.jpg」'。沒有領先的'/'。 – nitsujri

相關問題