【问题标题】:angular-rails-templates: templates are not foundangular-rails-templates:找不到模板
【发布时间】:2015-06-27 06:00:13
【问题描述】:

我有一个 Rails 应用程序,使用 angularjs 进行客户端开发。我尝试加载位于 `app/assets/javascripts/templates/' 中的模板:

myApp.config(['$routeProvider',
  function($routeProvider) {
    $routeProvider.
      when('/', {
        templateUrl: '/index.html',
        controller: 'MainController'
      }).
      otherwise({
        redirectTo: '/'
      });
  }]);

但我总是收到错误:“错误:[$compile:tpload] 无法加载模板:/index.html”。

我尝试将“模板”文件夹移出 javascript - app/assets/templates,并通过将以下行添加到 config/application.rb 将其添加到我的资产管道负载中:config.assets.paths << Rails.root.join("app","assets","templates")

在使用模板的完整路径之前,我一直收到相同的错误消息:templateUrl: '/assets/index.html',

  1. 为什么第一种方法不够用? angular-rails-templates gem 不应该在 app/assets/javascripts/templates 中寻找模板?

  2. 为什么要在我的 javascript 中使用资产的完整路径?

【问题讨论】:

    标签: ruby-on-rails angularjs angular-routing ngroute angularjs-templates


    【解决方案1】:

    我通过在 Gemfile 中添加“gem 'sprockets'”解决了这个问题

    【讨论】:

      【解决方案2】:

      我的问题是 sprockets 不兼容。 2.1.3 版可以工作,所以我把它放在我的Gemfile

      gem 'sprockets', '2.12.3'
      

      我跑了bundle update sprockets,一切都很好。

      【讨论】:

      • 您的//= require_tree ./templates 中有application.js 吗?
      • 是的,它显示“GET localhost:3000/index.html 404 (Not Found)”所以我猜它不在模板文件夹中。
      • 在我执行上述操作之前,这正是我的问题。你重启服务器了吗?
      • 值得注意的是,当我遇到这个问题时,很多人建议不要使用 rails 资产管道,而是将模板放入 /public/templates 或类似的东西中。
      • 你同意这种放弃资产的做法吗?
      【解决方案3】:

      实践表明,您应该将 Angular 模板保存在 ./public 文件夹中。例如,在public 文件夹中创建一个名为模板的文件夹。现在你可以这样称呼他们:templateUrl: 'templates/index.html'

      这是有道理的,因为 app/assets/ 确实只用于 javascript 和 css 文件。你也有app/views中的html文件,但这些是由服务器编译的,因为它们使用.erb扩展名。您想要的是随时准备使用常规的html 文件。所以你把它们放到公共文件夹中。

      【讨论】:

      • 我看到这行得通,但我不明白为什么angular-rails-templates gem 在这种情况下存在。
      • 因为有些人觉得需要打破这种模式,将 html 部分保留在 javascript 文件夹中。对于较小的应用程序,这不应该是一个大问题。当事情变得更大时,最好将它们保存在公共文件夹中。
      • 另一个原因是有些人想使用像hamlslim这样的html预处理器来处理视图。如果您将视图放在/public 中,则不能使用预处理器。
      【解决方案4】:

      试试这个,我希望这会奏效。

       myApp.config(function ($routeProvider) {
        $routeProvider.
          when('/', {
           templateUrl: '/index.html',
           controller: 'MainController'
          }).
          otherwise({
           redirectTo: '/'
         });
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-23
        • 2015-02-03
        • 1970-01-01
        • 2014-03-17
        相关资源
        最近更新 更多