我不想使用//= 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_tag
和stylesheet_link_tag
是合理的。但这样做是否合适让员工干得好?
我使用此代码优化着陆:
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 :(得分:0)
我认为这太过分了。
如果您不喜欢要求完整树无序,您可以逐个手动要求它们。
//= js_file_a
//= js_file_b
与您的解决方案相比:
您仍然需要自己输入文件名。
def add_asset(*files)
当工作可以在其他地方轻松完成时,添加了几个不必要的助手。