【问题标题】:How to make bootstrap & jquery working together in rails 3.2.12 app which has rail engines?如何使 bootstrap 和 jquery 在具有铁路引擎的 rails 3.2.12 应用程序中协同工作?
【发布时间】:2013-05-11 13:26:02
【问题描述】:

我们正在开发具有多个 rails enginesrails 3.2.12 应用程序。 main app 中有导航栏和用户菜单。功能模块位于 rails engine。其中engine 之一称为customerx,它使用户能够管理客户信息,例如创建客户、更改客户信息等。

上周我们在 rails_main 应用程序中添加了bootstrap,以利用良好的引导格式。我们发现的问题是 jquery datepicker 和 html 插入功能在 Rails 引擎中停止工作。

这里是main app's application.js

//= require jquery
//= require jquery_ujs
//= require jquery-ui
//= require_tree .
//= require bootstrap

application.js 中有需要引导。

我们没有在 rails 引擎的 application.js 中加入 require bootstrap。这是引擎的application.js:

//= require jquery
//= require jquery_ujs
//= require jquery-ui
//= require_tree .

function add_fields(link, association, content) {
  var new_id = new Date().getTime();
  var regexp = new RegExp("new_" + association, "g")
  $(link).parent().before(content.replace(regexp, new_id));
}

点击new customer form上的add_more_contact链接时,firebug出现错误:

ReferenceError: add_fields is not defined

在主应用程序中添加引导程序后,engines 也不再工作。

我们在网上做了一些搜索。 bootstrap 需要 jquery 才能工作。但是jquery-uibootstrap 之间可能存在冲突。我们按照建议将require bootstrp 放在main app's application.js 的底部。我们还尝试在main app's application.js 中使用$.noConflict()。然而,这些还不足以让bootstrapjquery 一起工作。我们还需要做什么才能使rails engine 中的jquery(ui)bootstrap 一起工作?感谢您的帮助。

【问题讨论】:

    标签: ruby-on-rails-3 twitter-bootstrap jquery


    【解决方案1】:

    修复 add_fields

    首先让我们修复 add_fields。此函数称为 jQuery($(link)),但定义在全局命名空间中。这就是它不起作用的原因。

    要使用全局命名空间中的 jQuery 函数编写函数,您需要将其编写为 jQuery 插件

    (function($) {
      $.fn.add_fields = function(link, association, content) {
        var new_id = new Date().getTime();
        var regexp = new RegExp("new_" + association, "g")
        $(link).parent().before(content.replace(regexp, new_id));
      };
    }(jQuery));
    

    然后你可以在 jQuery 中使用add_fields()

    引导程序和 jQuery UI

    这两个库之间存在一些冲突。你不能在没有任何改变的情况下一起使用它们。

    根据您的情况,据我所知,这里有两种解决方案:

    1. 完全放弃 jQuery UI 并使用 Bootstrap 的数据选择器。也不错。
    2. 使用包含它们两个的经过调整的库,例如 jQuery UI Bootstrapa matching Rails gem 用于此库。

    如果您想坚持使用 Bootstrap 并且没有太多需要修改的日期选择器,我更喜欢解决方案 #1。

    【讨论】:

    • 非常有趣的解决方案。几个问题。 1. add_fields 位于引擎的 application.js 中,引擎位于其隔离的命名空间中。引擎中的 add_fields 函数也可以是它自己的命名空间吗? 2.如果我们放弃jquery-ui,jquery还有什么功能我们会失去?现在引擎中有自动完成、操作 html 和 rails ajax 调用。 3、如果我们决定只使用bootstrap而放弃jquery-ui,我们需要做什么?可能我们需要删除 application.js 中的 //=require jquery-ui 以及 application.html 中的 cdn 链接。有什么我们可以效仿的例子吗?谢谢。
    • 我们使用上面的代码在一个引擎中更改了 add_fields。不知何故,当我们通过单击 检查 html 源代码时,主应用程序中的 application.js 中仍然没有 add_fields。我们可能错过了什么?
    • @user938363, 1. 放弃jquery UI,你不会失去太多,juqeryUI只是一个UI库,Bootstrap也有很多UI,你可以随时使用其他第三方用于某些功能(例如自动完成)的派对 UI 插件,通常它们比 jQueryUI 更好,因为它们专注。对于像处理 html 和 ajax 这样的功能,它们与 jQueryUI 无关,它们是 jQuery 的一部分,您仍然拥有。 Bootstrap 也依赖于 jQuery。 2. 对于add_fields,你在评论中说的是require,你需要检查文件是否正确。
    • 我们对 add_fields 进行了测试。缺少引擎的 application.js 没有加载(仅加载了主应用程序的 application.js)。如果我们在主应用程序的 javascript 文件夹中创建另一个带有 add_fields 和 datapicker 的 .js 文件,那么这些功能就会起作用。
    • @user938363,你的代码很好用 :) 我对引擎还不太熟悉,回答的代码主要是关于编写 jQuery 函数。
    【解决方案2】:

    我们发现rails enginesassets 根本没有加载。这就是为什么所有 js 功能都不适用于引擎的原因。现在是main app's application.js

    //= require jquery
    //= require jquery_ujs
    //= require jquery-ui
    //= require_tree .
    //= require my_engine_name/application.js
    //= require bootstrap
    

    这是提供有关如何为 Rails 引擎加载资产的解决方案的帖子:

    Engine's assets with Rails 3.1

    为什么添加引导程序会导致引擎资产消失,我们还不知道。希望有人可以阐明问题的原因。

    【讨论】:

      猜你喜欢
      • 2015-12-07
      • 2013-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-16
      • 1970-01-01
      • 1970-01-01
      • 2011-09-12
      相关资源
      最近更新 更多