我创建一个
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