ruby-on-rails-3 angularjs

ruby on rails 3 - Ubicación de las vistas de AngularJS dentro de la aplicación Rails



ruby-on-rails-3 (9)

Creé una nueva carpeta en la Aplicación / Activos / Javascript llamada Angular. La carpeta Angular contiene subcarpetas para controladores, vistas, servicios y directivas.

Ahora para hacer referencia a una vista, digamos sample.html. Así es como se veía mi ruta de templateUrl.

.when (''/ sample'', {templateUrl: ''/assets/angular/views/sample.html'', controller: ''SampleCtrl''})

De esta manera, todo el código Angular reside en una sola carpeta y no se dispersa por todo el lugar. Además, la línea de activos de Rails se puede aprovechar para minimizar y comprimir los controladores y servicios de Angular.

Estoy tratando de integrar AngularJS dentro de una aplicación Rails. Tengo una aplicación Rails con un controlador de libros y un modelo de libro. En la vista de índice de Rails tengo esto, y AngularJS debería asumir desde aquí:

.page_text{"ng-app" => "books"} .row .twelve.columns %div{"ng-view" => ""}

Y el controlador AngularJS se ve así:

function BooksOverviewCtrl($scope, $http) { $http.get(''/books.json'').success(function(data) { $scope.books = data; }); } BooksOverviewCtrl.$inject = [''$scope'', ''$http''];

Y este es el routeProvider:

angular.module(''books'', []). config([''$routeProvider'', function($routeProvider) { $routeProvider. when(''/books'', { templateUrl: ''books/book-overview.html.haml'', controller: BooksOverviewCtrl }); }]);

Actualmente, la vista de AngularJS se encuentra en "app / asset / javascripts / angularjs / books / book-overview.html.haml". Cuando cargo la página, dice que no se encontró la página, así que ¿dónde tengo que almacenar las vistas de AngularJS en mi aplicación Rails? Este es el error:

GET http://localhost:3000/books/book-overview.html.haml 404 (Not Found)


Después de algunas investigaciones, descubrí que hay dos maneras de lidiar con esto. La primera opción es la forma en que Mahbub y Adnan Doric mencionan: almacenar los archivos en la carpeta pública porque de todos modos son archivos html básicos.

Aunque esto funciona, no me parece natural, porque entonces los archivos se dispersan. Algunos están en la carpeta pública, y otros están en la carpeta de activos / javascripts. No es mi opción preferida, pero podría funcionar bien para otras personas.

La segunda opción es almacenar las rutas en un archivo específico, como "asset / javascripts / route.js.erb". Debido a la ".erb" es posible utilizar la ruta de los recursos de Rails dentro del archivo y crear una ruta relativa como esta:

when(''/books'', { templateUrl: "<%= asset_path(''book-overview.html.haml'') %>", controller: BooksOverviewCtrl });

Tal vez no sea la solución perfecta, pero para mí esto funciona mejor, porque ahora todos mis archivos Angular se mantienen juntos en la carpeta "asset / javascripts".


He desactivado la canalización de activos en config / application.rb y puse todos los archivos en una carpeta pública. Dado que los archivos del lado del cliente (proyecto angularJS) no necesitan ningún procesamiento, filtros, elegí de esa manera.


Lo siguiente puede ser bueno si desea mantener los dos completamente separados.

Una opción podría ser crear un enlace simbólico del sistema de archivos entre la /ngapp/dist o /ngapp/build y la carpeta /public o una subcarpeta dentro de /public . Use un servidor de gruñidos / nodos para desarrollar y probar, de modo que no tenga que reconstruir cada vez, y luego grunt build de forma /ngapp/dist carpeta vinculada /ngapp/dist cuando esté listo para ingresar a su servidor remoto.

Esto mantiene la carpeta AngularJS separada de la aplicación Rails, pero permite el acceso solo a los archivos de compilación finales, no a los archivos de origen dentro de su carpeta de aplicaciones AngularJS.


Pone los parciales de AngularJS en la carpeta pública SIN deshabilitar la canalización de activos, solo asegúrese de que esté accesible en su navegador en la URL especificada.


Puedes intentar usar la gema js_assets

Slim para AngularJS

Por ejemplo, queremos usar plantillas Slim en la aplicación AngularJS. Deja que nuestras plantillas estén en app/assets/webapp/ . Hacemos los siguientes ajustes:

# config/application.rb config.assets.paths << Rails.root.join(''app'', ''assets'', ''webapp'') # config/initizlizers/assets_engine.rb Rails.application.assets.register_engine(''.slim'', Slim::Template) # config/environments/production.rb config.assets.precompile += [''*.html'']

No olvides conectar un archivo en tu application.js

//= require app_assets

Ahora, para la plantilla app/assets/webapp/blogs/edit.html.slim podemos obtener una ruta según el entorno:

var path = asset_path(''blogs/edit.html'') // the function will return for development: // /assets/blogs/edit.html // and for production // /assets/blogs/edit-5eb3bb250d5300736006c8944e436e3f.html $routeProvider .when(''/books'', { templateUrl: assetPath(''bookOverview.html''), controller: BooksOverviewCtrl });



También sugiero usar plantillas de rieles angulares

Gemfile

gem ''angular-rails-templates''

$ bundle install

aplicacion.js

//= require angular-rails-templates

app.js

angular.module(''myApp'', [''templates''])

Ahora, cuando incluya templateUrl: ''books/book-overview.html.haml'' buscará en la carpeta de activos la vista correcta.


Yo uso el $templateCache para manejar esto. Así que en la vista tengo:

<script type="text/ng-template" id="bookOverview.html"> <%= render partial: "book-overview" %> </script>

Luego, con $ routeProvider puedes simplemente:

$routeProvider .when(''/books'', { templateUrl: ''bookOverview.html'', controller: BooksOverviewCtrl });

De esta manera, puede mantener sus vistas en el directorio de app/views/books donde normalmente las guardaría.