2012-05-18 9 views
8

Hace poco creé una aplicación AngularJS 1.0.0rc8 con un back-end de Rails 3.2.3 y funcionó bien en el desarrollo, pero después de implementar en Heroku hubo un Error del proveedor desconocido - aparentemente la aplicación no pudo ver el objeto de servicio.AngularJS + Rails - Problemas al comprimir activos

sé que ahora es necesario incluir angulares-resource.js como un archivo separado e inyectar ngResource en el módulo de aplicación como esta:

// main app javascript file 

'use strict'; 

angular.module('contactapp', ['ngResource']). 
    config(['$routeProvider', function($routeProvider) { 
    $routeProvider. 
     when('/contacts', {template: 'assets/app/partials/contact-list.html', controller: ContactListCtrl}). 
     when('/contacts/new', {template: 'assets/app/partials/new-contact.html', controller: ContactListCtrl}). 
     when('/contacts/:contact_id', {template: 'assets/app/partials/contact-detail.html', controller: ContactDetailCtrl}). 
     otherwise({redirectTo: '/contacts'});  

}]); 

También sé que cuando los archivos se minified que la los controladores no pueden saber lo que sus dependencias son menos que también se inyectan en los objetos del controlador de esta manera:

ContactListCtrl.$inject = ['$scope', '$http', 'Contacts']; 

también he intentado hacerlo de la otra forma que recomienda angular con soporte de notat iones y pasando una función como esta:

var ContactListCtrl= ['$scope', '$http', 'Contacts', function($scope, $http, Contacts) { /* constructor body */ }]; 

Sin embargo, nada de esto parece que funciona.

La única forma de mi aplicación podría ver el recurso proporcionaron fue apagando la compresión de activos en el archivo production.rb, así:

# Compress JavaScripts and CSS 
    config.assets.compress = false 

tardó varias horas para mí para resolver esto, pero yo Recientemente vi otra aplicación Rails + AngularJS que tenía el mismo problema.

Jens Krause llegaron a la misma conclusión y lo explica en su blog: http://www.websector.de/blog/2012/01/17/fun-with-angularjs-rails-coffeescript-sass-another-cafe-townsend-example/

Si tengo una proporción relativamente grande de aplicaciones, y necesito para comprimir los activos, ¿cómo puedo evitar esto usando angular con rieles ?

Gracias.

Respuesta

3

Creo que el problema es que su minificador aún está confirmando el nombre de la variable del control en sí (ContactListCtrl -> a o lo que sea que haga).

¿Ha intentado definir sus controladores con la función module.controller?

angular.module('myModule', []) 
.controller('Controller1', ['dep1', 'dep2', function(dep1, dep2) { 
    //code 
}]); 
+1

He intentado este método también sin éxito, me sale el mismo error. Vea aquí: http://stackoverflow.com/questions/13459452/rails-3-angularjs-minification-does-not-work-in-production-unknown-provider – jemminger

2

modificado esta línea en mi config/ambientes/production.rb hizo el truco para mí:

config.assets.js_compressor = Sprockets::LazyCompressor.new { Uglifier.new(:mangle => false) } 
7

Si está utilizando los carriles 4, cambiar su js_compressor en sus entornos de producción y puesta en escena de :

config.assets.js_compressor = Uglifier.new(mangle: false) 
+1

Esto no funciona. – scaryguy

+1

Me ayudó (una aplicación de Angular + Rails en Heroku). –

Cuestiones relacionadas