2013-10-25 70 views
0

我不想使用//= require_tree .(因爲它加載了我擁有的所有資產,我也不需要),並且不希望每次都寫入javasctipt_include_tag("my_controller")。所以,我決定做以下幾點:這是一個很好的DRY方法嗎?

module ApplicationHelper 

    def add_asset(*files) 
    puts "DEBUG: add: " + files.to_s 

    content_for(:html_head) do 
     if GtFe::Application.assets.find_asset(*files) 
     yield :asset_include_tag 
     end 
    end 
    end 

    def javascript(*files) 
    add_asset(*files) do 
     content_for :asset_include_tag 
     javascript_include_tag(*files) 
    end 
    end 

    def stylesheet(*files) 
    add_asset(*files) do 
     content_for :asset_include_tag 
     stylesheet_link_tag(*files) 
    end 
    end 

end 

所以我使用的helper方法的名稱命名的產量和我有一個主add_asset()方法和兩個特定資產的方法。這是否是一個好方法?還是有更好的解決方案?

更新:

從軌道文檔:

例如,如果您生成一個ProjectsController,導軌也會增加 的app /資產/ Java腳本/ projects.js.coffee一個新的文件另一個是 app/assets/stylesheets/projects.css.scss。默認情況下,這些文件將立即使用require_tree 指令由您的應用程序使用 。有關 require_tree的更多詳細信息,請參閱清單文件和指令。

您也可以選擇成包括控制器特定樣式表和 JavaScript文件僅在使用 下列各自的控制器:<%= javascript_include_tag PARAMS [:控制器]%>或<%= stylesheet_link_tag PARAMS [:控制器]% >。儘管使用require_tree指令確保您不是 ,因爲這會導致您的 資產被多次包含。

所以javascript_include_tagstylesheet_link_tag是合理的。但是,這樣做是否好,讓這個工作人員幹掉?

UPDATE2:

我登陸這個代碼的改進:

module ApplicationHelper 

    def add_asset(asset_type, *files) 
    puts "DEBUG: add #{asset_type} files: #{files}" 

    content_for(:html_head) do 
     files.each do |file| 

     puts "DEBUG: now add #{asset_type}: #{file}" 

     if GtFe::Application.assets.find_asset(file) 
      yield(:asset_include_tag, file) 
     end 
     end 
    end 
    end 

    def javascript(*files) 
    add_asset("js", *files) do 
     content_for :asset_include_tag 
     javascript_include_tag 
    end 
    end 

    def stylesheet(*files) 
    add_asset("css", *files) do 
     content_for :asset_include_tag 
     stylesheet_link_tag 
    end 
    end 

end 

,然後我可以在每個視圖/佈局這麼寫的:

= javascript(params[:controller], "#{params[:controller]}_#{params[:action]}") 

回答

0

我覺得這是矯枉過正。

如果您不喜歡需要完整的樹無序,您可以要求他們一個一個手動。

//= js_file_a 
//= js_file_b 

與您的解決方案比較:

  1. 你仍然需要自己鍵入文件名。

    def add_asset(*files) 
    
  2. 當作業可以輕鬆地在其他地方完成時,添加了幾個不必要的助手。

+0

在控制器特定的CSS? – static

+0

是的,在所有js和css文件中,您都可以執行此操作。 –

相關問題