0

我不想使用 a //= 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 的名称,并且我有一个 mainadd_asset()方法和两个特定于资产的方法。这是一个好方法吗?或者有没有更好的解决方案?

更新:

来自 rails 文档:

例如,如果您生成一个 ProjectsController,Rails 还将在 app/assets/javascripts/projects.js.coffee 和 app/assets/stylesheets/projects.css.scss 添加一个新文件。默认情况下,这些文件可以立即使用 require_tree 指令供您的应用程序使用。有关 require_tree 的更多详细信息,请参阅清单文件和指令。

您还可以选择仅在各自的控制器中包含控制器特定的样式表和 JavaScript 文件,使用以下命令:<%= javascript_include_tag params[:controller] %> 或 <%= stylesheet_link_tag params[:controller] %>。但请确保您没有使用 require_tree 指令,因为这将导致您的资产被多次包含。

所以javascript_include_tagandstylesheet_link_tag是有道理的。但是,让这个产量员工干干好吗?

更新2:

我完成了以下代码改进:

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]}")
4

1 回答 1

0

我认为这是矫枉过正。

如果你不喜欢 require full tr​​ee unordered,你可以手动一一要求。

//= js_file_a
//= js_file_b

与您的解决方案比较:

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

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

于 2013-10-25T18:56:48.247 回答