创建Ruby Gem以将HTML/JavaScript插入主Application

Spa*_*lex 12 javascript ruby gem ruby-on-rails

我创建了一个Rails引擎,可以轻松地为rails应用程序包含一个JavaScript插件.问题是这个插件实际上只用于开发,当将应用程序推向生产时,开发人员需要删除require marxjavascript清单文件,然后删除JavaScript中的实际调用.

我希望做的是允许开发人员将其添加到Gemfile中,gem 'marxjs-rails', group: :development并在config/application.rbconfig/environments/development.rb中设置一些配置以进行插件设置.

然后gem应该将html插入父应用程序:

<script src='marx.js'></script>
<script>
  var marx = new Marx()
</script>
Run Code Online (Sandbox Code Playgroud)

我一直在玩一个帮助方法来插入html,但是我无法将其作为html插入.Rails继续逃避HTML.虽然我不喜欢这条道路.

我一直在浏览jasmine-gemrack-olark作为示例,但是无法完成任何工作.

UPDATE

这不是我真正想要的解决方案,但这可能对其他人有帮助,而且我正在使用它直到我能找到更好的方法来做到这一点.你可以在这里查看整个代码,但我会给你一些亮点:

# lib/marxjs/rails.rb
require "marxjs/rails/version"
require "marxjs/view_helpers"

module Marxjs
  module Rails
    class Engine < ::Rails::Engine
      initializer "marxjs.view_helpers" do
        ActionView::Base.send :include, ViewHelpers
      end
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

和视图助手:

# lib/marxjs/view_helpers.rb
require 'erb'

module Marxjs
  module ViewHelpers
    include ActionView::Helpers::OutputSafetyHelper

    def render_marxjs options={}, dev_only=true
      if dev_only == false || (dev_only && ::Rails.env.development?)
        binding.local_variable_set(:options, options.to_json)
        template_file = ::File.read(::File.expand_path('../templates/marxjs.erb', __FILE__))
        raw ERB.new(template_file).result(binding)
      end
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

这里带走的最重要的事情是,include ActionView::Helpers::OutputSafetyHelper而且require 'erb' 这使我们能够加载模板erb文件并用于ERB.new渲染它并用于raw防止rails逃脱html.我还将一个选项变量绑定到binding对象以将其发送到模板.

<script src="assets/marx.js"></script>
<script>
  var marx = new Marx(<%= options %>);
</script>
Run Code Online (Sandbox Code Playgroud)

最后在我的主rails应用程序中,我调用render_marxjs(controls: 'toggle-all')application.html.haml(如果你愿意,还可以调用.erb)

我仍然在寻找有人帮助我处理这个没有视图帮助方法,也能够通过环境文件设置一些配置,但我希望这可能有助于一些...

Ped*_*nto 1

对我来说,最好的方法是在所有环境中添加引擎,但需要单独使用application.html.haml

= javascript_include_tag "mark.js" if Rails.env.development?
Run Code Online (Sandbox Code Playgroud)

请务必将其添加到您的 config/application.rb 中并进行编译:

config.assets.precompile += %w( mark.js )
Run Code Online (Sandbox Code Playgroud)