这是一个很好的DRY方法吗?

时间:2013-10-25 18:42:20

标签: ruby-on-rails dry mixins yield assets

我不想使用//= require_tree .(因为它加载了我拥有的所有资产,我也不需要),并且不希望每次javasctipt_include_tag("my_controller")都写入。所以我决定做以下事情:

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

所以我在辅助方法中使用名为yield的名称,并且我有一个主add_asset()方法和两个特定于资产的方法。这是一个好方法吗?或者有更好的解决方案吗?

更新

来自rails docs:

  

例如,如果生成ProjectsController,Rails也会添加   app / assets / javascripts / projects.js.coffee上的新文件和另一个文件   应用程序/资产/样式表/ projects.css.scss。默认情况下,这些文件会   准备好使用require_tree立即使用您的应用程序   指示。有关详细信息,请参阅清单文件和指令   require_tree。

     

您还可以选择包含控制器特定的样式表和   JavaScript文件只能在各自的控制器中使用   以下:<%= javascript_include_tag params [:controller]%>或<%=   stylesheet_link_tag params [:controller]%>。确保你不是   但是,使用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]}")

1 个答案:

答案 0 :(得分:0)

我认为这太过分了。

如果您不喜欢要求完整树无序,您可以逐个手动要求它们。

//= js_file_a
//= js_file_b

与您的解决方案相比:

  1. 您仍然需要自己输入文件名。

    def add_asset(*files)
    
  2. 当工作可以在其他地方轻松完成时,添加了几个不必要的助手。