2012-05-18 12 views
8

Recentemente ho creato un'app AngularJS 1.0.0rc8 con un back-end Rails 3.2.3 e ha funzionato bene in fase di sviluppo, ma dopo la distribuzione in Heroku c'era un Errore provider sconosciuto - a quanto pare l'app non ha potuto vedere l'oggetto servizio.AngularJS + Rails - Problemi durante la compressione delle risorse

so che ora è necessario includere angolari-resource.js come file separato e iniettare ngResource nel modulo di applicazione in questo modo:

// 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'});  

}]); 

so anche che quando i file vengono minified che la i controllori non può dire ciò che i loro dipendenze sono meno che non siano anche iniettati nel oggetti controller in questo modo:

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

ho anche provato a fare il contrario che angolare raccomanda con staffa Notat ion e passando in una funzione come questa:

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

Tuttavia, niente di tutto ciò sembra funzionare.

L'unico modo la mia domanda potrebbe vedere la risorsa fornita era disattivando la compressione di asset nel file production.rb, in questo modo:

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

Ci sono volute diverse ore per me di conoscere questo, ma io recentemente ho visto un'altra app Rails + AngularJS che ha avuto lo stesso problema.

Jens Krause sono giunti alla stessa conclusione e spiega sul suo blog: http://www.websector.de/blog/2012/01/17/fun-with-angularjs-rails-coffeescript-sass-another-cafe-townsend-example/

Se ho un relativamente grande app, e ho bisogno di comprimere i beni, come faccio a ottenere intorno a questo utilizzando angolare con Rails ?

Grazie.

risposta

3

Penso che il problema è che il minificatore sta ancora oscurando il nome della variabile del controllo stesso (ContactListCtrl -> a o qualunque cosa faccia).

Avete provato a definire i controller con la funzione module.controller?

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

Ho provato anche questo metodo senza successo, ottengo lo stesso errore. Vedi qui: http://stackoverflow.com/questions/13459452/rails-3-angularjs-minification-does-not-work-in-production-unknown-provider – jemminger

2

L'aggiunta di questa linea al mio config/ambienti/production.rb ha fatto il trucco per me:

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

Se stai usando Rails 4, modificare la js_compressor nei vostri ambienti di produzione e di gestione temporanea a :

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

Questo non funziona. – scaryguy

+1

Helped me (un'applicazione Angular + Rails su Heroku). –

Problemi correlati