9

我正在创建一个使用 gem "jquery-rails" 的可挂载引擎插件。我在 .gemspec 文件中添加了这段代码

s.add_dependency "jquery-rails", "~> 3.0.1"

并运行bundle installbundle update。(顺便说一句,这是必要的吗?由于可安装的 rails 引擎已经添加了“rails 4.0.1”,而从一开始就需要“jquery-rails 3.0.4”作为其依赖项?)。

在 app/assets/javascript/mountable_engine_name/application.js

//= require jquery
//= require jquery-ujs
//= require_tree .

但是,当我在 test/dummy/ 上运行服务器并访问任何使用该标签的模板时,<%= javascript_include_tag "mountable_engine_name/application" %>它会显示错误"couldn't find file 'jquery'"

我尝试创建一个全新的可安装引擎插件,但它发生了同样的情况。

我做错什么了吗?

PS。对不起我的英语不好。

更新
实际上它发生在所有需要 jquery 和 jquery-ujs 的清单文件上,都在 app/assets/javascript/ 和 test/dummy/app/assets/javascript/ 中。

4

6 回答 6

18

我知道最初的问题是几个月前提出的,但是我在学习 Rails 引擎教程时遇到了同样的问题,所以我发帖以防万一这有助于其他人......

我发现我需要更新四个文件:

1.) 向您的 .gemspec 文件添加依赖项

    #file: <your engine name>.gemspec

    s.add_dependency "jquery-rails", "~> 3.1.1"

2.) 更新你的引擎 application.js 文件:

    #file: <your engine name>/app/assets/javascripts/blorgh/application.js

    ...
    //= require jquery                                                                                                                         
    //= require jquery_ujs                                                                                                                     
    //= require_tree .

3.) 更新您的父应用 application.js 文件:

    #file: <your engine name>/test/dummy/app/assets/javascripts/application.js

    ...
    //= require jquery                                                                                                                         
    //= require jquery_ujs                                                                                                                     
    //= require_tree .

4.) 根据这个SO 线程,您需要向您的 engine.rb 文件添加一个要求:

    #file: lib/<your engine name>/engine.rb

    module <your engine name>
      class Engine < ::Rails::Engine
        require 'jquery-rails'
        isolate_namespace Blorgh
      end
    end

和平。

于 2014-08-16T03:58:30.847 回答
5

您应该在 gem 的主文件中要求 jquery-rails。

如果您有一个名为“foo”的 gem,请在其主文件中执行此操作:

# lib/foo.rb

require "jquery-rails"

# ...
于 2014-03-18T17:20:30.503 回答
2

我发现有必要在引擎的 Gemfile 中包含一个引用:

#Gemfile
gem "jquery-rails"

此外,jquery ujs 的要求是用下划线完成的:

//=require jquery_ujs

祝你好运!

于 2013-11-12T23:11:12.337 回答
1

这是每个刚开始使用 Rails Engine 的新手都会遇到的问题。我知道这是一个可以追溯到今天 4 年的问题,并且它的答案已经标记为正确。在为我的引擎应用程序编写 TestCases 时,我在 Rails 5 中遇到了同样的问题,我注意到我必须添加require jquery到我的所有引擎application.js文件中,这违反了 rails DRY 范式。

我觉得标记的答案有点违反 Rails DRY(不要重复自己)范式。

在基于 Rails 引擎的解决方案中,application.js存在于:

  1. 域资产目录;
  2. 您所有的引擎资产目录(即无论如何您在该引擎中拥有多个应用程序
  3. 您所有的引擎测试虚拟目录(即无论如何您在该引擎中有多个应用程序

解决方案

  1. 从您的目录中查找您的.gemspec文件并添加一个依赖项,例如

    s.add_dependency "jquery-rails", "~> 3.1.1"
    
  2. cd进入引擎应用程序的根目录。例如

    cd engines/csv_importer/
    

    注意:csv_importer是我的引擎中的应用程序的名称。

  3. 通过运行安装添加的依赖项:

    bundle install
    
  4. 现在接下来要做的就是require query-rails进入你的lib/engine.rb.

    require 'jquery-rails'
    

    ..在我自己的情况下,我在 engine.rb 中添加了一个简单的初始化程序,并且也需要'jquery-rails'在其中。这使我能够从域/父应用程序运行其他任务,例如将引擎应用程序本身作为 gem 捆绑到父应用程序中。要求jquery-rails那里也使“jquery-rails”在我的特定引擎应用程序中全局可用。例如,我有:

    require 'jquery-rails'
    
    module CsvImporter #Note CsvImporter is the engine name/app in my own case
      class Engine < ::Rails::Engine
        isolate_namespace CsvImporter #Note CsvImporter is the engine name/app in my own case
    
        # This enables me to be able to correctly migrate the database from the parent application.
        initializer :append_migrations do |app|
          unless app.root.to_s.match(root.to_s)
            config.paths['db/migrate'].expanded.each do |p|
              app.config.paths['db/migrate'] << p
            end
          end
        end
      end
    end
    
  5. 通过运行以下命令启动您的 Rails 应用程序:

    rails s
    

这就是我为解决 Rails 可安装引擎插件中的问题所做的工作。我希望这对 2018 年 5 月的新手有所帮助。

谢谢

于 2018-05-05T23:03:17.087 回答
0

添加运行时和开发依赖项:

s.add_runtime_dependency "jquery-rails", "~> 3.0.1"
s.add_development_dependency "jquery-rails", "~> 3.0.1"

这对我有用。

于 2014-02-14T11:31:08.113 回答
0

我有同样的问题。

使用引擎时,您有两个application.js文件。一个在应用程序中,一个在引擎中。

看起来您试图在父应用程序中的名称空间目录中包含 jquery,这实际上不是引擎。

简要背景

引擎可以以不同的方式使用,所以我的方法是在父应用程序(我称之为apps)中嵌套引擎,就像这样

PARENT_APP_NAME/apps/ENGINE_NAME/app/assets/javascripts/ENGINE_NAME/application.js

那是你需要包括的地方

//= require jquery
于 2014-05-24T13:51:30.123 回答