在rake任务中使用ApplicationController.render

时间:2018-09-26 13:20:48

标签: ruby-on-rails ruby-on-rails-5

我正在尝试通过使用我的布局的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任务的一部分中尝试在预处理器中使用它们。还有其他想法吗?

0 个答案:

没有答案