我正在尝试通过使用我的布局的rake任务生成一些静态HTML错误页面。我已经设法完成大部分工作,但是遇到一个错误:我无权访问ActionView::Helpers::AssetTagHelper
方法。
这可能是因为我将这个rake任务绑定到了哪里。这就是所有这些工作的方式。我已将HTML添加为资产:
Rails.application.config.assets.paths << Rails.root.join('app', 'assets', 'html')
Rails.application.config.assets.precompile << '*.html'
Rails.application.config.assets.register_mime_type('text/html', '.html')
然后创建了一个与assets:precompile
相关联的rake任务:
Rake::Task['assets:precompile'].enhance do
Rake::Task['my_app:create_non_digest_assets'].invoke
end
namespace(:my_app) do
logger = Logger.new($stderr)
task(create_non_digest_assets: :'assets:environment') do
manifest_file = File.new(Dir.glob(File.join(Rails.root, 'public/**/assets/.sprockets-manifest-*.json')).first)
asset_dir = File.dirname(manifest_file)
whitelisted_assets = []
whitelisted_assets.concat(Rails.config.non_digest_assets) rescue nil
JSON.load(manifest_file)['assets'].each do |asset, digested_asset|
if whitelisted_assets.any? { |pattern| File.fnmatch?(pattern, asset) }
logger.info("(My APP) creating #{asset} symlink for #{digested_asset}")
FileUtils.ln_s(
File.join(asset_dir, digested_asset),
File.join(asset_dir, asset),
{ force: true }
)
end
end
end
end
并添加了这部分配置,以便它知道要创建未消化链接的资产以及运行ApplicationController.render
的Sprocket预处理器:
Rails.application.config.non_digest_assets = %w(*.html)
Sprockets.register_preprocessor 'text/html', -> (asset) do
asset[:data] = ::ApplicationController.render({
inline: asset[:data],
layout: 'layouts/application1'
})
end
我猜测资产标签助手可能无法正常工作,因为我正在assets:precompile
任务的一部分中尝试在预处理器中使用它们。还有其他想法吗?