我不想使用 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_tag
andstylesheet_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]}")