【问题标题】:Requiring javascript from files overriding assets of a rails engine从覆盖 Rails 引擎的资产的文件中需要 javascript
【发布时间】:2015-05-20 09:27:15
【问题描述】:

我编写了一个 Rails 引擎,并希望能够在任何安装它的应用程序中对其进行自定义。

[ENGINE/]app/assets/my_engine/application.js:

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

[APP/]app/assets/my_engine/engine_customization.js:

//= require selectize

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

这会导致js报错(selectize不是函数)

我尝试要求其他文件/库,但没有一个被 sprockets 加载。

不确定我做错了什么,或者这实际上是 sprockets 中的错误。

编辑:

[ENGINE/]app/views/layouts/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

【问题讨论】:

  • 为什么需要js...直接包含在js文件中再试试

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


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    一)

    需要 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'
    

    【讨论】:

    • 我尝试了 A),但仍然得到同样的错误。这是因为 /app/assets/javascripts/application.js 从未包含在内。引擎有自己的布局,仅包含 /app/assets/javascripts/my_engine/application.js
    • 请发布布局的代码,其中包含 application.js。如果要包含另一个资产文件,则必须将默认应用程序清单添加到 assets.precompile
    • 我刚刚注意到我已经实现了您的答案的 B)。 application.js 和 application.css 都在预编译数组中。我编辑了我的问题以包含布局。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-29
    • 1970-01-01
    • 1970-01-01
    • 2012-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多