2012-06-14 34 views
16

section 2.2.2, "CSS and Sass"中,我被告知將image-url('delete.png')放在我的菜單中。所以我有。sass-rails資產管道:錯誤地生成圖像路徑; `url(/images/blah.png)`而不是`url(/assets/blah.png)`

但是,生成CSS像

background-image: url(/images/delete.png) 

,而不是說我告訴無處不應該發生,正確的和顯而易見的事情的東西,

background-image: url(/assets/delete.png) 

什麼。哎呀。

我花了幾天的時間試圖弄清楚這是從哪裏來的。

這是a gist of relevant settings導致此行爲。這裏是a gist of the same files in an earlier version of our code base(在我們實施了資產管道之後,它實際上在這種令人沮喪的行爲出現之前實際工作了大約一週)。你能發現差異嗎?你能想到的任何其他文件可能會導致這種情況?

  • 我們特意使用sass-rails一個老版本,因爲在預編譯的新版本是導致Stack level too deep!錯誤。
  • 我們正在使用指南針。在解決方法

    因爲實際上故障排除的資產管道還挺吮吸


兩個hackish的嘗試。

1:將圖像/影像

我試圖只是所有圖像移動到public/images,並添加作爲負載路徑。這在dev中可用(圖像可以在/assets/images下訪問),但是對於生產的預編譯只會將指紋圖像置於/assets(obvs),所以當sass-rails放入url(/imagse/delete-120398471029384102364.png)時,找不到它。

2:製作/公共/圖像的符號鏈接到/公/資產

這將在生產中可能的工作,但在發展中/資產文件夾不存在,所以url(/images/delete.png)指令導致unfound圖像。

+0

你有沒有嘗試過以下方法:'asset_path'delete.png''? – ccyrille

+0

這將是'asset-url('delete.png',image)'。是的,我試過了。正如人們所希望的那樣,'image-url('delete.png')'只是簡寫。他們有完全相同的行爲。 – chadoh

+0

如何使用.sass.erb文件並使用<%= asset_path('delete.png')%>?雖然它仍然是一種解決方法,但是如果sass-rails出現故障,可能值得嘗試診斷。 – Chris

回答

2

它看起來像這個問題:https://github.com/rails/sass-rails/issues/57 如果是這樣,你應該嘗試找到Compass和Sass-rails之間的良好組合版本。

也許升級的一切(包括滑軌)到最新版本,它仍然是做(在捆綁1.2使用bundle outdated命令知道升級什麼寶石)

+2

「嘗試在Compass和Sass-rails之間找到好的版本組合」。真棒。我喜歡這樣的解決方案。 「放入兩個隨機版本,'bundle update','rake tmp:cache:clear',並移位 - 刷新瀏覽器。」這是我在SO上問之前所做的。它很爛。 – chadoh

+0

儘管感謝您的錯誤鏈接。看起來它仍然困擾着很多人,雖然(關閉後很多評論說它仍然在發生)。 – chadoh

2

這是我們的HAML護欄的組合的最佳方式,指南針和sass護欄。不過我們運行rails 3.2.6。 這對我們很有效。

gem'compass',git:'git://github.com/chriseppstein/compass。混帳 '裁判: '3a4c5c75dca9f07f6edf2f0898a4626269e0ed62'

寶石 'HAML護欄',git的: '混帳://github.com/indirect/haml-rails.git',裁判: '92c41db61f20a9f122de25bc73e5045cfccdbcd5'

寶石'上海社會科學院護欄,‘〜> 3.2.5’

10

如果你沒有這個已經,命名你的CSS文件*.css.scss(相對於.sass - 如果你這樣做,你可能需要調整一些語句的語法)。然後使用image_path幫手,而不是image-path,例如:

background-image:url(image_path('delete.png')); 

我預計這將解決您的問題。如果沒有,這種方法爲您產生的資產路徑是什麼?

+0

這不起作用(除非我沒有采取適當的步驟,這是一種可能性;我進行了更改,然後執行'rake tmp:cache:clear && rm -r .sass-cache/*',然後cmd + shift -R在Chrome中的頁面,所有的資產返回狀態200而不是202未修改 - 應該工作?)。它給出了我以前的相同結果(「/ images」被返回而不是「/ assets」)。不過,我甚至都沒有在任何文檔中看到這種語法。爲什麼不'image-url'? – chadoh

8

這看起來是由於您的青菜護欄的版本(3.1.0)。我可以重現您的問題(感謝發佈Gemfile),並且在碰撞到sass-rails 3.1.4時它會消失。

嘗試升級到3.1.4和清除tmp/cache。還要確保你沒有碰到任何瀏覽器緩存。

我知道你說的3.1.4是造成其他問題......你有沒有試過更高版本?

+1

這是我第一次嘗試它,所以我的upvote,導致你得到我原來的一半獎金。但是,似乎我做了其他事情,因爲回到原來的3.1.0版本繼續工作。我今天重試(幾個星期後),sass-rails 3.1.4不再有效。升級Rails和sass-rails到3.1.6也失敗了。我可能會嘗試升級到3.2,但這是很多工作。 – chadoh

+1

你在測試之間清除緩存(特別是瀏覽器和RAILS_ROOT/tmp/cache)嗎? – avaynshtok

+0

在每次代碼更改後,我會''rake tmp:cache:clear && rm -r .sass-cache/*',然後在Chrome中使用cmd + shift-R(不依賴緩存)。 – chadoh

0

不一定是解決辦法,但肯定是一個可行的選擇:如果你打開使用拼合指南針,你會削減HTTP請求的數量,並能夠與精靈地圖手動指定圖片路徑,即'$ sprites:sprite-map(「PATH/*。png」);'

+0

有趣的思想;看起來Compass仍然會(通過sass)爲此創建一個「/ images」指令,而不是正確的「/ assets」。 – chadoh

+0

啊,你說的沒錯。我在我的描述中忘記了在資產文件中包含必要的相對路徑標誌。 c.relative_assets = true – RhinoWalrus

0

完整性檢查當前資產管道中的文件。檢查它在這裏列出的目錄之一:

<%= debug Rails.application.config.assets.paths %> 

在什麼相對路徑指南針期望找到圖像下檢查(,看看它是否墊按照Compass config docs,這些應該告訴你一個: 。

<%= debug config.compass.http_images_path %> 
<%= debug config.compass.http_generated_images_path %> 

我猜這是第一個無論哪種方式,比較它們的路徑圖像的asset_path:

<%= debug asset_path 'delete.png' %> 

如果路徑不匹配,也許您需要在您的環境CONFIGS(development.rb,...)來調整路徑此例如:

config.compass.http_images_path = '/assets. 

或者,你可以移動圖像到http_images_path或http_generated_images_path希望找到它。

在點,asset_path/ASSET_URL(比脆硬編碼少得多),應該有希望的工作。我基於similar technique的這一關,我看到的樣式,

+0

謝謝!這一切看起來不錯,但。 「asset_path」和「image_path」助手在erb/haml中工作。這是sass中無法工作的'(asset | image) - (path | url)'助手。 – chadoh

0

對於我來說,

更改image_pathimage-path工作了.scss。稍後,我再次更改爲image_path,現在工作正常。

刪除緩存沒有幫助我。

-2

當我編輯我的。scss文件(添加一個空格)並重新加載頁面我得到正確的結果。我刪除了它正確工作的空間後。