Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 让Dojo使用Ruby on Rails 4_Ruby On Rails_Dojo - Fatal编程技术网

Ruby on rails 让Dojo使用Ruby on Rails 4

Ruby on rails 让Dojo使用Ruby on Rails 4,ruby-on-rails,dojo,Ruby On Rails,Dojo,我正在将我的symfony应用程序移植到RubyonRails 4.2.0。我的设置在symfony中运行良好。关于如何将dojo与RoR一起使用有很多问题,但它使用的是不推荐使用的代码 在我的application.html.erb中 <script>dojoConfig = {async: true}</script> <%= javascript_include_tag 'http://ajax.googleapis.com/ajax/libs/dojo/1.

我正在将我的symfony应用程序移植到RubyonRails 4.2.0。我的设置在symfony中运行良好。关于如何将dojo与RoR一起使用有很多问题,但它使用的是不推荐使用的代码

在我的application.html.erb中

<script>dojoConfig = {async: true}</script>
<%= javascript_include_tag 'http://ajax.googleapis.com/ajax/libs/dojo/1.10.3/dojo/dojo.js'%>
如果我使用require而不是define,那么我得到的require是未定义的

更新

我尝试将dojo安装到应用程序中,并取得了一些进展。我将下载内容从dojo复制到vendor/assets/javascript/dojo。dojo目录包含dojo、dojox和digit子目录

我接着补充说

//= require dojo/dojo/dojo.js
转到app/assets/javascript/application.js。我还将home.js文件中的define改回require。当我重新加载页面时,我收到一个错误,抱怨它找不到工具提示。我接着补充说:

//= require dojo/dijit/Tooltip.js
重新加载时,它抱怨了一堆其他丢失的js文件。这和我在使用symfony时遇到的问题是一样的,这就是为什么我选择了谷歌图片。如何访问rails以搜索供应商目录中的文件?这是其中一个错误:

"NetworkError: 404 Not Found - http://amcolan.loc/dijit/_base/manager.js"
更新2

因为require_树适用于应用程序资产,所以我认为它也适用于供应商。我补充说

//= require_tree ../../../vendor/assets/javascripts/dojo
到我的application.js文件。当我重新加载页面时,大约花了一分钟。我猜它正在加载dojo目录树中的所有内容,这并不奇怪。页面加载已完成,没有任何错误。当我将鼠标悬停在工具提示项上(代码的目的是显示工具提示)时,Firebug抛出了大约2000个错误并退出。所有错误似乎都是“ReferenceError:define未定义”

更新3

我又开始使用googleapi了。我的application.html.erb头如下所示

<head>
  <meta charset="UTF-8">
  <title><%= content_for?(:title) ? yield(:title) : "American Colonial Ancestors" %></title>
  <%= stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track' => true %>
  <script>dojoConfig = {async: true}</script>
  <%= javascript_include_tag 'http://ajax.googleapis.com/ajax/libs/dojo/1.10.3/dojo/dojo.js'%>
  <%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>
  <%= csrf_meta_tags %>
</head>

正确%>
dojoConfig={async:true}
正确%>

我颠倒了javascript包含的顺序。重新加载页面时没有出现错误。工具提示不起作用,但当我将鼠标悬停在某个项目上时,它不会生成任何错误。我在home.js代码中放了一个错误的语句,它出现在控制台上,所以我知道代码正在被解析。我的页面设置可能有一个bug。

让Dojo toolkit与Ruby on Rails协同工作的方法可能不止一种。这即使不是最有效的方法,也是最简单的方法。这适用于Rails 4.2.0。我想它在其他版本中也会起作用

在views/layouts/application.html.erb中,在包含站点脚本之前添加以下内容:

<script>dojoConfig = {async: true}</script>
<%= javascript_include_tag 'http://ajax.googleapis.com/ajax/libs/dojo/1.10.3/dojo/dojo.js'%>
dojoConfig={async:true}
将版本更改为最新版本或您希望使用的版本。这里我使用的是1.10.3版。dojo网站说,源代码还有其他CDN(内容交付网络)。我正在使用谷歌,就像他们的例子一样。以下是我头部部分的相关部分:

<head>
  <meta charset="UTF-8">
  <%= stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track' => true %>
  <%= stylesheet_link_tag "http://ajax.googleapis.com/ajax/libs/dojo/1.10.3/dijit/themes/claro/claro.css" %>
  <script>dojoConfig = {async: true}</script>
  <%= javascript_include_tag 'http://ajax.googleapis.com/ajax/libs/dojo/1.10.3/dojo/dojo.js'%>
  <%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>
  <%= content_for :page_script %>
  <%= csrf_meta_tags %>
</head>

正确%>
dojoConfig={async:true}
正确%>
如果要使用工具箱的任何对话框、工具提示等,则需要通过添加以下内容来包括一个stytlesheet:

<%= stylesheet_link_tag "http://ajax.googleapis.com/ajax/libs/dojo/1.10.3/dijit/themes/claro/claro.css" %>

根据您自己的需求更改版本和主题。这里我使用的是claro主题。你可以在上面的“我的头”部分看到。我认为安置并不重要。您还需要在body语句中声明主题类。这是我的:

<body class="claro">

关于该主题的一个示例具有不同的javascript格式。我认为不需要什么特别的东西。下面是一个工作脚本的示例:

require(["dojo/dom", "dojo/ready", "dijit/Tooltip"], function(dom, ready, Tooltip)
{
  ready(function()
  {
    var head = "<div class='footnote-text'>";
    var tail = "</div>";
    var fnt1  = head + dom.byId("fnb1").innerHTML + tail;
    var fnt2  = head + dom.byId("fnb2").innerHTML + tail;

    new Tooltip({connectId: ["footnote1"], position:["after","above","below"], label: fnt1 });
    new Tooltip({connectId: ["footnote2"], position:["after","above","below"], label: fnt2 });
  });
});
require([“dojo/dom”、“dojo/ready”、“dijit/Tooltip”],函数(dom,ready,Tooltip)
{
就绪(函数()
{
var head=“”;
var tail=“”;
var fnt1=head+dom.byId(“fnb1”).innerHTML+tail;
var fnt2=head+dom.byId(“fnb2”).innerHTML+tail;
新的工具提示({connectId:[“footnote1”],位置:[“之后”,“上面”,“下面”],标签:fnt1});
新的工具提示({connectId:[“footnote2”],位置:[“之后”,“上面”,“下面”],标签:fnt2});
});
});

正如我在问题中提到的,我尝试将DojoToolkit源代码放在vendor/assets/javascript中。从1.7版开始,dojo开始使用异步模块定义(AMD)。AMD加载程序可能与Rails预编译功能不兼容。我对这件事了解得不够,不能肯定地说

对于
,似乎缺少关闭
。这可能会导致
dojo.js
无法加载。
dojo.js
包含
define
require
的定义
define()
调用用于定义模块,
Require()
用于加载模块。您需要使用
require()
而不是前面提到的
define()
,我没有包括所有生成的代码。还提到,如果使用require代替define,我会得到相同的结果。你指的是我所说的以外的地方吗?如何从
index.html
调用
home.js
。如果你能发布完整的代码就更好了。不知何故,require和define模块没有加载,因此出现了
ReferenceError:define未定义
我克服了这个错误,并更新了帖子以反映这一点。据我所知,home.js之所以被包含是因为//=require_树。在application.js文件中。
<%= stylesheet_link_tag "http://ajax.googleapis.com/ajax/libs/dojo/1.10.3/dijit/themes/claro/claro.css" %>
<body class="claro">
require(["dojo/dom", "dojo/ready", "dijit/Tooltip"], function(dom, ready, Tooltip)
{
  ready(function()
  {
    var head = "<div class='footnote-text'>";
    var tail = "</div>";
    var fnt1  = head + dom.byId("fnb1").innerHTML + tail;
    var fnt2  = head + dom.byId("fnb2").innerHTML + tail;

    new Tooltip({connectId: ["footnote1"], position:["after","above","below"], label: fnt1 });
    new Tooltip({connectId: ["footnote2"], position:["after","above","below"], label: fnt2 });
  });
});