创建Ruby Gem将HTML / JavaScript插入主应用程序

前端之家收集整理的这篇文章主要介绍了创建Ruby Gem将HTML / JavaScript插入主应用程序前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我创建一个 Rails Engine来轻松地包含一个用于rails应用程序的JavaScript插件.问题是这个插件真的只用于开发,并且当将应用推送到生产时,开发人员需要删除javascript清单文件中的require marx,然后在JavaScript中实际调用.

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

宝石应该将html插入到父应用程序中:

<script src='marx.js'></script>
<script>
  var marx = new Marx()
</script>

我一直在玩一个帮助方法来插入html,但我不能把它作为HTML插入. Rails继续逃避HTML.虽然我不太喜欢这条路,

我一直在寻找茉莉花宝石和机架奥拉克斯作为例子,但不能完全有任何工作.

UPDATE

这不是我真正寻找的解决方案,但这可能会帮助别人,是我正在使用的,直到我能追踪到更好的方式来做到这一点.您可以查看整个代码here,但我会给您的亮点:

# 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

和视图助手:

# 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

包括ActionView :: Helpers :: OutputSafetyHelper以及require’erb’
这使我们能够加载一个模板erb文件,并使用ERB.new来渲染它,并使用raw来保持rails不会转移到html.我也绑定一个选项变量到绑定对象发送到模板.

<script src="assets/marx.js"></script>
<script>
  var marx = new Marx(<%= options %>);
</script>

最后在我的主rails应用程序中,我在application.html.haml(或.erb,如果你喜欢)中调用render_marxjs(控制:“toggle-all”)

再次,我仍然在寻找一个人来帮助我处理这个没有一个查看帮助方法,也可以通过环境文件设置一些配置,但我希望这可能会帮助一些…

解决方法

您可以在不创建引擎的情况下实现此目的.

>添加一个名为lib / marxjs / script_inserter.rb的文件

module Marxjs
  module ScriptInserter
    BODY_TAG = %r{</body>}

    JS_SCRIPT = %q{
      <script src='marx.js'></script>
      <script>
        var marx = new Marx()
      </script>    
    }

    def insert_marxjs
      if (
        response.content_type == 'text/html' &&
        response.body.match(BODY_TAG)
      )
        response.body = response.body.gsub(BODY_TAG,JS_SCRIPT + '\\0')
      end      
    end
  end
end

>添加lib / marxjs / railtie.rb

module Marxjs
  class Railtie < Rails::Railtie
    initializer "marxjs-rails" do |app|
      ActionController::Base.send :include Marxjs::ScriptInserter      
      ActionController::Base.after_filter :insert_marxjs
    end
  end
end

>更新lib / marxjs / rails.rb

require "marxjs/rails/version"
require "marxjs/view_helpers"
require "marxjs/script_inserter"

# move rails initialization code to railtie.rb

>将宝石添加到Gemfile

gem 'marxjs-rails',group: :development
原文链接:https://www.f2er.com/ruby/271632.html

猜你在找的Ruby相关文章