创建RubyGem将HTML/JavaScript插入主应用程序
我创建了一个用于rails应用程序的JavaScript插件。问题是这个插件实际上只用于开发,当将应用程序推向生产时,开发人员需要删除javascript清单文件中的创建RubyGem将HTML/JavaScript插入主应用程序,javascript,ruby-on-rails,ruby,gem,Javascript,Ruby On Rails,Ruby,Gem,我创建了一个用于rails应用程序的JavaScript插件。问题是这个插件实际上只用于开发,当将应用程序推向生产时,开发人员需要删除javascript清单文件中的require marx,然后删除javascript中的实际调用 我希望开发人员可以使用gem'marxjs rails',group::development将其添加到gem文件中,并在config/application.rb或config/environments/development.rb中为插件设置一些配置 然后,ge
require marx
,然后删除javascript中的实际调用
我希望开发人员可以使用gem'marxjs rails',group::development
将其添加到gem文件中,并在config/application.rb或config/environments/development.rb中为插件设置一些配置
然后,gem应将html插入父应用程序:
<script src='marx.js'></script>
<script>
var marx = new Marx()
</script>
这里最重要的是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>
var marx=新马克思();
最后,在我的主rails应用程序中,我在application.html.haml(或.erb,如果您愿意)中调用render_marxjs(控件:'toggle all')
同样,我仍在寻找一个没有视图助手方法的人来帮助我处理这个问题,并且能够通过环境文件设置一些配置,但我希望这可能会对我有所帮助…对我来说,最好的方法是在所有环境中添加引擎,但在
application.html.haml上需要单独的引擎:
= javascript_include_tag "mark.js" if Rails.env.development?
请确保将其添加到您的config/application.rb中并进行编译:
config.assets.precompile += %w( mark.js )
您可以在不创建引擎的情况下实现这一点
- 添加一个名为
lib/marxjs/script\u 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
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
require "marxjs/rails/version"
require "marxjs/view_helpers"
require "marxjs/script_inserter"
# move rails initialization code to railtie.rb
- 更新
lib/marxjs/rails.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
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
require "marxjs/rails/version"
require "marxjs/view_helpers"
require "marxjs/script_inserter"
# move rails initialization code to railtie.rb
- 将gem添加到
Gemfile
gem 'marxjs-rails', group: :development
的功能类似于此,它将UI元素添加到屏幕中,但仅在开发阶段(默认情况下)。请参见谢谢pedro,尽管我正在寻找一种方法,使开发人员不必做任何事情,只需将其包含在GEM文件中即可启动并运行。然后,如果他们想要进一步控制,他们会在application.rb中设置一些配置,或者一些我认为您无法做到的事情。没有办法知道你想把它包括在哪个版面中。谢谢你,哈里什。这看起来很有希望。我将尝试一下,最好使用rack中间件做同样的事情,它更通用,可以用于任何使用rack的ruby框架(几乎100%的框架)。