2015-05-20 51 views
1

我编写了一个rails引擎,希望能够在任何安装它的应用程序中对其进行自定义。要求javascript文件覆盖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错误(selectize不是一个函数)

我试过要求其他文件/库和没有被链轮加载。

不知道我是否做错了什么,或者如果这实际上是一个链轮的错误。

编辑:

[ENGINE /]应用/视图/布局/ 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 
+0

为什么你需要js ...直接将其包含在js文件中,然后尝试 – Milind

回答

2

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

我在我的宝石中编写了生成器,将视图复制到应用程序中,其他人为控制器创建装饰器,其中必须指定应用程序布局。但有一些注意事项:如果你的布局包含使用路径助手(即导航栏)的视图,你需要在助手的前缀加上“main_app”。因此,blog_post_path变为main_app.blog_post_path,而polymorphic_path([:edit,:admin,@resource])变为main_app.polymorphic_path ...等等。

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

0

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

A)

要求my_engine/application.js内 应用程序的JS清单

//app/assets/javascripts/application.js 

//= require myengine/application.js 

B) 添加my_engine/application.js到assets.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' 
+0

我给了A)一个尝试,但仍然得到相同的错误。这是因为/app/assets/javascripts/application.js从不包含在内。引擎有自己的布局,其中只包含/app/assets/javascripts/my_engine/application.js – jreinert

+0

plz发布布局代码,其中包含application.js。如果你想包含另一个资产文件,那么默认的应用程序显示你必须将它添加到'assets.precompile' –

+0

我刚刚注意到我已经实现了B)的答案。 application.js和application.css都在预编译数组中。我编辑了我的问题以包含布局。 – jreinert