要求来自文件的javascript覆盖rails引擎的资产

时间:2015-05-20 09:27:16

标签: ruby-on-rails asset-pipeline sprockets

我写了一个rails引擎,希望能够在安装它的任何应用程序中自定义它。

[引擎/]应用/资产/ my_engine / application.js中:

//= require jquery
//= require ./engine_specific
//= require ./engine_customization

[APP /]应用/资产/ my_engine / engine_customization.js:

//= require selectize

$(document).ready(function () {
    $('select').selectize();
});

这会导致js错误(选择不是函数)

我尝试过要求其他文件/ libs,并且没有链接器加载。

不确定我是否做错了或者这实际上是链轮中的错误。

编辑:

[引擎/]应用/视图/布局/ my_engine / application.html.haml:

!!!
%html
  %head
    %title My Engine
    = stylesheet_link_tag    "my_engine/application", media: "all"
    = javascript_include_tag "my_engine/application"
    = csrf_meta_tags
  %body
    = render 'my_engine/shared/header'
    #content
      #wrapper
        = yield

2 个答案:

答案 0 :(得分:2)

事实证明混合引擎和应用程序布局相当棘手,所以我采取了不同的方法。也像设计一样的宝石似乎使用:

我在我的gem中编写了生成器,将视图复制到app以及其他为控制器创建装饰器的人,其中必须指定应用程序布局。但它有一些注意事项:如果您的布局包含使用路径助手(即导航栏)的视图,则需要在帮助器前面添加" main_app。"。所以blog_post_path变为main_app.blog_post_path,而polymorphic_path([:edit,:admin,@ resources])变为main_app.polymorphic_path ......等等。

另一件事是应用程序控制器可能定义的实例变量或before_filters,并且布局呈现的视图需要这些变量。这些你需要在控制器装饰器中定义。

答案 1 :(得分:0)

默认情况下,只有应用程序的application.js清单由sprockets预编译。 所以你有两个选择:

A)

要求my_engine/application.js 应用程序的js显示

//app/assets/javascripts/application.js

//= require myengine/application.js 

B) 将my_engine/application.js添加到a​​ssets.precompile数组,然后将其包含在javascript_include_tag

 #engine.rb

 initializer "myengine.precompile" do |app|
   app.config.assets.precompile += %w(application.js)
 end

 #views/foos/show.html.erb

 javascript_include_tag 'myengine/application.js'