Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
创建RubyGem将HTML/JavaScript插入主应用程序_Javascript_Ruby On Rails_Ruby_Gem - Fatal编程技术网

创建RubyGem将HTML/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

我创建了一个用于rails应用程序的JavaScript插件。问题是这个插件实际上只用于开发,当将应用程序推向生产时,开发人员需要删除javascript清单文件中的
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%的框架)。