2014-07-03 66 views
3

所以我有一個項目,特定於頁面的樣式和css。我已經把這些文件放到了他們自己的目錄assets/#{type}/page-specific/,我試圖編寫一個正則表達式規則來通知預編譯器與他們做這件事。Rails 3 - 預編譯文件夾中的所有css,sass和scss文件

這對於房子的JS方面非常有用,但是CSS證明更加困難。

# page specific style files: 
app/assets/stylesheets/page-specific/something.css.sass 
app/assets/stylesheets/page-specific/default.css 
app/assets/stylesheets/page-specific/home.css.scss 

我在我的config/initializers/assets.rb文件,此正則表達式的工作:

Rails.application.config.assets.precompile << /(page-specific\/[^(css)]+.css)/ 

的問題是,該[^(css)]部分沒有做我想做什麼比較,因爲它會過濾掉任何有交流或者在裏面。我真正想要的是一種匹配整個字符串「css」並停在那裏的方法。

另外,我知道傳統的看法是簡單地編寫樣式,以便不需要特定於頁面的樣式表而支持包含整個樣式表的application.css。我同意。然而,這是一個非常龐大的代碼庫,將Rails升級帶回家需要花費很多時間,並且沒有時間花費分析和重構這種性質的東西。

我試過讓分隔符指令[^\.]停在第一個點上,但是這在一些供應商的樣式表上發生了變化,這些樣式表使用點作爲分隔符,如jquery.treeview.css.sass。顯然,我可以更改文件名,但是我們是一支規模不斷擴大的團隊,我希望儘可能靈活地制定規則,這樣我們就不會有任何文件潛入,當他們沒有得到時,這些文件就會被炸燬預編譯。

+0

你有 「* = require_tree。」在你的app/assets/stylesheets/application.css中的某處?如果沒有,嘗試添加它可能會有所幫助。 – rootless

+0

正如所解釋的那樣,在完整應用程序範圍之外的資源需要預編譯並單獨包含。 – DVG

+0

所有這三個示例文件路徑似乎都不在「完整應用程序的範圍之外」(如果這意味着「在應用程序的目錄樹之外」)。實際上,默認情況下,它們應該通過資產預編譯來獲取,因爲它們在應用程序/資產中(如果require_tree存在於application.css中)。我想我錯了。 – rootless

回答

3

這個答案是專門針對正則表達式的。您正在尋找「缺少字符序列css」而不是[^(css)]


此正則表達式採用類似的方法對你的:

/(page-specific\/(?:(?!\.css).)++\.css)/ 

說明:

  • page-specific\/字符序列 「頁專用/」 的字面匹配。
  • (?:打開一個非捕獲組。
    • (?!\.css)斷言當前索引不是字符序列「的CSS」。

如果這個斷言在所述第一時間該組匹配失敗,則當前部分將不能被匹配(特定頁面/的CSS是沒有好),否則這終止組量化,因爲我們已經匹配.css,並返回到\.css)/完成。

    • .匹配任何除換行符。
  • )++有組織地關閉和量化無限次(無返回)。
    注意:Ruby支持從Ruby 1.9開始的所有格量詞。
  • \.css字面上匹配字符序列「.css」。

visualization

瞭解更多:


如何如果沒有過,這正則表達式做它用nongreedy修改:

/(page-specific\/.+?\.css)/ 

由於.+?的匹配,而幾次越好,所捕獲的數據,保證在第一.css結束。

visualization

瞭解更多:


PS:你可能已經忘記了逃跑靠近你的正則表達式的.css/末點。


指定者:
http://www.tutorialspoint.com/ruby/ruby_regular_expressions.htm

+2

這是門票!謝謝你的理由和解釋解決方案 – DVG

+0

你應該得到一個這個反應的福氣勳章 –

+0

@TheDembinski你的榮幸是我最好的獎勵。 – Unihedron

0

好吧,我想我現在明白了。假設你有這兩個文件:

app/assets/stylesheets/page-specific/default.css 
app/assets/stylesheets/page-specific/more-specific/home.css.scss 

後您添加到您的配置/初始化/ assets.rb

Rails.application.config.assets.paths << Rails.root.join('app', 'assets', 'stylesheets', 'page-specific') 
Rails.application.config.assets.precompile << /.+\.css$/ 

請注意,這甚至應該爲工作目錄之外「應用程序/資產」(當然,你需要修改添加到config.assets.paths的路徑)。

你應該能夠引用它們在你的網頁ERB像這樣:

<%= stylesheet_link_tag 'default', media: 'all' %> 
    <%= stylesheet_link_tag 'more-specific/home', media: 'all' %> 

我希望這有助於。

相關問題