SlideShare une entreprise Scribd logo
1  sur  28
Télécharger pour lire hors ligne
AngularJS on Rails
Come integrare AngularJS in un'applicazione Rails
senza essere insultati dagli altri sviluppatori.
Quando programmi,
non c'è differenza tra te
e un cinghiale!
1
SconosciutoToscano
Creare una API json in RoR
per dialogare con
AngularJS
AngularJS: API racchiusa in un Service
definire una 'resource' intorno alla rotta della API
LegoSet = $resource("/api/v1/lego_sets/:id", {id: "@id"}, ...)
API + versioning
# routes.rb
namespace :api, defaults: {format: 'json'} do
namespace :v1 do
resources :lego_sets, only: [:index, :show] do
resources :lego_parts, only: [:show]
end
end
end
GET http://lego_app.com/api/v1/lego_sets/
GET http://lego_app.com/api/v1/lego_sets/21103
GET http://lego_app.com/api/v1/lego_parts/3001
app
`--controllers
|-- api
| `-- v1
| |-- lego_sets_controller.rb
| `-- lego_parts_controller.rb
|-- application_controller.rb
/app/controllers/api/v1/lego_sets_controller.rb
module Api::V1
class LegoSetsController < ApplicationController
respond_to :json
def index
respond_with LegoSet.all
end
def show
respond_with LegoSet.find(params[:id])
end
end
end
Rails 4 request params
Protezione dal mass-assignment spostata nel
controller.
Utile creare un helper method
def safe_lego_set_params
def safe_params
params.require(:lego_set).permit(:set_id, :piece_id, :num, ...)
end
end
Si puo agire direttamente nel Layout
app/views/layouts/application.html.erb
...
<head>
<%= javascript_include_tag "//ajax.googleapis.com/ajax/libs/angularjs/1.2.0/angular.min.js" %>
<%= javascript_include_tag "//ajax.googleapis.com/ajax/libs/angularjs/1.2.0/angular-resource.min.js" %>
</head>
Rapido ma molto da cinghiale...
Si può usare l'asset pipeline
I files di angular possono essere inseriti manualmente in
app/assets/javascripts/application.js
//= require jquery
//= require jquery_ujs
...
//= require lib/angular.min
//= require lib/angular.resource
//= require <nome_app_angular>
...
La soluzione per tutte le stagioni
gem angularjs-rails
bundle
quindi
//= require angular
oppure, se si vuole usare la versione instabile
//= require unstable/angular
Indipendentemente dalla
soluzione adottata è
necessario prendere alcune
precauzioni per evitare
grattacapi in produzione.
Proteggere il codice Angular (1)
1. Mangle: false
disabilitare il renaming delle variabili (mangle)
# nel file config/environments/production.rb
config.assets.js_compressor = Uglifier.new(mangle: false)
Proteggere il codice Angular (2)
2. depenency injection naming
Specificare i nomi degli argomenti in ogni funzione che
accetta 'services' ad es.:
@LegoCtrl = ("$scope", "LegoSet", $scope, LegoSet) ->
angular.module('LegoApp').factory 'LegoSet', [ $resource, ($resource) -> ...]
^ ^
Proteggere il codice Angular (3)
3. usare una gemma
gem 'ngannotate-rails'
https://github.com/kikonen/ngannotate-rails
Strutturare il codice JS (1)
require risorse angular dopo i turbolinks e prima di
tree
// app/assets/javascript/application.js
//= require jquery
//= require jquery_ujs
//= require turbolinks
//= require lib/angular.min
//= require lib/angular.resource
//= require <nome_app_angular>
//= require tree
Strutturare il codice JS (2)
Ogni app. AngularJS consiste in un modulo principale,
controllers, directives e services. Suddividere il codice in
cartelle all'interno di app/assets/javascripts:
4 controllers
4 directives
4 services
...E lib per le tutte le altre dipendenze
Sfruttare la protezione CSRF di RoR
Proteggere l'applicazinone da attacchi cross-site
request forgery attraverso un token inserito nella
sezione head di ogni pagina. Usare quel token in tutte le
API requests.
application.js.coffee
LegoApp.config ($httpProvider) ->
authToken = $("meta[name="csrf-token"]").attr("content")
$httpProvider.defaults.headers.common["X-CSRF-TOKEN"] = authToken
Usare i turbolinks
Non usate il tag ng-app nell'html. Usate page:load
application.js.coffee
$(document).on 'page:load', ->
$('[ng-app]').each ->
module = $(this).attr('ng-app')
angular.bootstrap(this, [module])
In questo modo l'applicazione AngularJS verrà
inizializzata correttamente ogni volta che i turbolinks
fanno fetch&replace.
Ulteriori alternative
Yeoman
4 SPA (single page applications)
4 sviluppatori specializzati in JS
1. rails new lego_app && cd lego_app
2. mkdir angular && cd angular
3. npm install -g yo grunt-cli bower
4. npm install generator-angular generator-karma
5. yo angular
6. npm install && bower install
Bower + Grunt
(rails senza asset pipeline)
4 molto disaccoppiato
4 perfetto se si prevede un upgrade di Rails
rails-assets
Proxy tra Bundler e Bower: converte i componenti
Bower in rails gems.
1. aggiungere https://rails-assets.org come gem source
2. indicare i componenti Bower da convertire:
gem 'rails-assets-BOWER_PACKAGE_NAME'
3. bundle install: recupera il componente dal registro di
Bower e lo 'impacchetta' come gem
Non usare Rails
4 rails-api
4 Sinatra
4 AngularFire + Firebase
4 NodeJS
4 Go
Sviluppate per bene.
grazie.
@microspino

Contenu connexe

Similaire à AngularJS On Rails by Daniele Spinosa

Fe04 angular js-101
Fe04   angular js-101Fe04   angular js-101
Fe04 angular js-101DotNetCampus
 
Sviluppo Web Agile Con MonoRail
Sviluppo Web Agile Con MonoRailSviluppo Web Agile Con MonoRail
Sviluppo Web Agile Con MonoRailStefano Ottaviani
 
AngularJs, Bootstrap e Cordova: il connubio per app mobile cross-platform
AngularJs, Bootstrap e Cordova: il connubio per app mobile cross-platformAngularJs, Bootstrap e Cordova: il connubio per app mobile cross-platform
AngularJs, Bootstrap e Cordova: il connubio per app mobile cross-platformGabriele Gaggi
 
WhyMCA12 - Android Tools e la gestione di progetti complessi
WhyMCA12 - Android Tools e la gestione di progetti complessiWhyMCA12 - Android Tools e la gestione di progetti complessi
WhyMCA12 - Android Tools e la gestione di progetti complessiMarco Gasparetto
 
SPRING - MAVEN - REST API (ITA - Luglio 2017)
SPRING - MAVEN - REST API (ITA - Luglio 2017)SPRING - MAVEN - REST API (ITA - Luglio 2017)
SPRING - MAVEN - REST API (ITA - Luglio 2017)Valerio Radice
 
Sviluppare app native per iOS
Sviluppare app native per iOSSviluppare app native per iOS
Sviluppare app native per iOSGaspare Novara
 
Sviluppare apps native per iOS - Lo Stretto Digitale
Sviluppare apps native per iOS - Lo Stretto DigitaleSviluppare apps native per iOS - Lo Stretto Digitale
Sviluppare apps native per iOS - Lo Stretto Digitalelostrettodigitale
 
jQuery - 1 | WebMaster & WebDesigner
jQuery - 1 | WebMaster & WebDesignerjQuery - 1 | WebMaster & WebDesigner
jQuery - 1 | WebMaster & WebDesignerMatteo Magni
 
jQuery - 1 | WebMaster & WebDesigner
jQuery - 1 | WebMaster & WebDesignerjQuery - 1 | WebMaster & WebDesigner
jQuery - 1 | WebMaster & WebDesignerMatteo Magni
 
Introduzione a GAE - Alessandro Aglietti e Lorenzo Bugiani
Introduzione a GAE - Alessandro Aglietti e Lorenzo BugianiIntroduzione a GAE - Alessandro Aglietti e Lorenzo Bugiani
Introduzione a GAE - Alessandro Aglietti e Lorenzo Bugianifirenze-gtug
 
Le novità di Ionic 4- Il framework basato su Angular per sviluppare applicazi...
Le novità di Ionic 4- Il framework basato su Angular per sviluppare applicazi...Le novità di Ionic 4- Il framework basato su Angular per sviluppare applicazi...
Le novità di Ionic 4- Il framework basato su Angular per sviluppare applicazi...Antonio Gallo
 
Link. java server faces [santi caltabiano]
  Link. java server faces [santi caltabiano]  Link. java server faces [santi caltabiano]
Link. java server faces [santi caltabiano]santi caltabiano
 

Similaire à AngularJS On Rails by Daniele Spinosa (20)

Fe04 angular js-101
Fe04   angular js-101Fe04   angular js-101
Fe04 angular js-101
 
AngularJS-Intro
AngularJS-IntroAngularJS-Intro
AngularJS-Intro
 
Sviluppo Web Agile Con MonoRail
Sviluppo Web Agile Con MonoRailSviluppo Web Agile Con MonoRail
Sviluppo Web Agile Con MonoRail
 
AngularJs, Bootstrap e Cordova: il connubio per app mobile cross-platform
AngularJs, Bootstrap e Cordova: il connubio per app mobile cross-platformAngularJs, Bootstrap e Cordova: il connubio per app mobile cross-platform
AngularJs, Bootstrap e Cordova: il connubio per app mobile cross-platform
 
Many Designs Elements
Many Designs ElementsMany Designs Elements
Many Designs Elements
 
WhyMCA12 - Android Tools e la gestione di progetti complessi
WhyMCA12 - Android Tools e la gestione di progetti complessiWhyMCA12 - Android Tools e la gestione di progetti complessi
WhyMCA12 - Android Tools e la gestione di progetti complessi
 
SPRING - MAVEN - REST API (ITA - Luglio 2017)
SPRING - MAVEN - REST API (ITA - Luglio 2017)SPRING - MAVEN - REST API (ITA - Luglio 2017)
SPRING - MAVEN - REST API (ITA - Luglio 2017)
 
Web frameworks
Web frameworksWeb frameworks
Web frameworks
 
Sviluppare app native per iOS
Sviluppare app native per iOSSviluppare app native per iOS
Sviluppare app native per iOS
 
Sviluppare apps native per iOS - Lo Stretto Digitale
Sviluppare apps native per iOS - Lo Stretto DigitaleSviluppare apps native per iOS - Lo Stretto Digitale
Sviluppare apps native per iOS - Lo Stretto Digitale
 
Novità di Asp.Net 4.0
Novità di Asp.Net 4.0Novità di Asp.Net 4.0
Novità di Asp.Net 4.0
 
jQuery - 1 | WebMaster & WebDesigner
jQuery - 1 | WebMaster & WebDesignerjQuery - 1 | WebMaster & WebDesigner
jQuery - 1 | WebMaster & WebDesigner
 
Presentazione tirocinio
Presentazione tirocinio Presentazione tirocinio
Presentazione tirocinio
 
jQuery - 1 | WebMaster & WebDesigner
jQuery - 1 | WebMaster & WebDesignerjQuery - 1 | WebMaster & WebDesigner
jQuery - 1 | WebMaster & WebDesigner
 
Introduzione a GAE - Alessandro Aglietti e Lorenzo Bugiani
Introduzione a GAE - Alessandro Aglietti e Lorenzo BugianiIntroduzione a GAE - Alessandro Aglietti e Lorenzo Bugiani
Introduzione a GAE - Alessandro Aglietti e Lorenzo Bugiani
 
#dd12 grillo daniele_xpages_tips_tricks_rev2
#dd12 grillo daniele_xpages_tips_tricks_rev2#dd12 grillo daniele_xpages_tips_tricks_rev2
#dd12 grillo daniele_xpages_tips_tricks_rev2
 
Le novità di Ionic 4- Il framework basato su Angular per sviluppare applicazi...
Le novità di Ionic 4- Il framework basato su Angular per sviluppare applicazi...Le novità di Ionic 4- Il framework basato su Angular per sviluppare applicazi...
Le novità di Ionic 4- Il framework basato su Angular per sviluppare applicazi...
 
Link. java server faces [santi caltabiano]
  Link. java server faces [santi caltabiano]  Link. java server faces [santi caltabiano]
Link. java server faces [santi caltabiano]
 
Laravel Framework PHP
Laravel Framework PHPLaravel Framework PHP
Laravel Framework PHP
 
Introduzione a node.js
Introduzione a node.jsIntroduzione a node.js
Introduzione a node.js
 

Plus de Commit University

Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Commit University
 
Crea il tuo assistente AI con lo Stregatto (open source python framework)
Crea il tuo assistente AI con lo Stregatto (open source python framework)Crea il tuo assistente AI con lo Stregatto (open source python framework)
Crea il tuo assistente AI con lo Stregatto (open source python framework)Commit University
 
Breaking REST Chains_ A Fastify & Mercurius Pathway to GraphQL Glory.pdf
Breaking REST Chains_ A Fastify & Mercurius Pathway to GraphQL Glory.pdfBreaking REST Chains_ A Fastify & Mercurius Pathway to GraphQL Glory.pdf
Breaking REST Chains_ A Fastify & Mercurius Pathway to GraphQL Glory.pdfCommit University
 
Accelerating API Development: A Pit Stop with Gin-Gonic in Golang-Slide.pdf
Accelerating API Development: A Pit Stop with Gin-Gonic in Golang-Slide.pdfAccelerating API Development: A Pit Stop with Gin-Gonic in Golang-Slide.pdf
Accelerating API Development: A Pit Stop with Gin-Gonic in Golang-Slide.pdfCommit University
 
Collaborazione, Decisionalità e Gestione della Complessità nel Tempo: cosa ...
Collaborazione, Decisionalità e Gestione della Complessità nel Tempo: cosa ...Collaborazione, Decisionalità e Gestione della Complessità nel Tempo: cosa ...
Collaborazione, Decisionalità e Gestione della Complessità nel Tempo: cosa ...Commit University
 
Commit - Qwik il framework che ti stupirà.pptx
Commit - Qwik il framework che ti stupirà.pptxCommit - Qwik il framework che ti stupirà.pptx
Commit - Qwik il framework che ti stupirà.pptxCommit University
 
Sviluppare da zero una Angular Web App per la PA
Sviluppare da zero una Angular Web App per la PASviluppare da zero una Angular Web App per la PA
Sviluppare da zero una Angular Web App per la PACommit University
 
Backstage l'Internal Developer Portal Open Source per una migliore Developer ...
Backstage l'Internal Developer Portal Open Source per una migliore Developer ...Backstage l'Internal Developer Portal Open Source per una migliore Developer ...
Backstage l'Internal Developer Portal Open Source per una migliore Developer ...Commit University
 
Prisma the ORM that node was waiting for
Prisma the ORM that node was waiting forPrisma the ORM that node was waiting for
Prisma the ORM that node was waiting forCommit University
 
Decision-making for Software Development Teams - Commit University
Decision-making for Software Development Teams - Commit UniversityDecision-making for Software Development Teams - Commit University
Decision-making for Software Development Teams - Commit UniversityCommit University
 
Component Design Pattern nei Game Engine.pdf
Component Design Pattern nei Game Engine.pdfComponent Design Pattern nei Game Engine.pdf
Component Design Pattern nei Game Engine.pdfCommit University
 
Un viaggio alla scoperta dei Language Models e dell’intelligenza artificiale ...
Un viaggio alla scoperta dei Language Models e dell’intelligenza artificiale ...Un viaggio alla scoperta dei Language Models e dell’intelligenza artificiale ...
Un viaggio alla scoperta dei Language Models e dell’intelligenza artificiale ...Commit University
 
Prototipazione Low-Code con AWS Step Functions
Prototipazione Low-Code con AWS Step FunctionsPrototipazione Low-Code con AWS Step Functions
Prototipazione Low-Code con AWS Step FunctionsCommit University
 
KMM survival guide: how to tackle struggles between Kotlin and Swift
KMM survival guide: how to tackle struggles between Kotlin and SwiftKMM survival guide: how to tackle struggles between Kotlin and Swift
KMM survival guide: how to tackle struggles between Kotlin and SwiftCommit University
 
Da Vuex a Pinia: come fare la migrazione
Da Vuex a Pinia: come fare la migrazioneDa Vuex a Pinia: come fare la migrazione
Da Vuex a Pinia: come fare la migrazioneCommit University
 
Orchestrare Micro-frontend con micro-lc
Orchestrare Micro-frontend con micro-lcOrchestrare Micro-frontend con micro-lc
Orchestrare Micro-frontend con micro-lcCommit University
 
Fastify has defeated Lagacy-Code
Fastify has defeated Lagacy-CodeFastify has defeated Lagacy-Code
Fastify has defeated Lagacy-CodeCommit University
 

Plus de Commit University (20)

Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!
 
Crea il tuo assistente AI con lo Stregatto (open source python framework)
Crea il tuo assistente AI con lo Stregatto (open source python framework)Crea il tuo assistente AI con lo Stregatto (open source python framework)
Crea il tuo assistente AI con lo Stregatto (open source python framework)
 
Breaking REST Chains_ A Fastify & Mercurius Pathway to GraphQL Glory.pdf
Breaking REST Chains_ A Fastify & Mercurius Pathway to GraphQL Glory.pdfBreaking REST Chains_ A Fastify & Mercurius Pathway to GraphQL Glory.pdf
Breaking REST Chains_ A Fastify & Mercurius Pathway to GraphQL Glory.pdf
 
Accelerating API Development: A Pit Stop with Gin-Gonic in Golang-Slide.pdf
Accelerating API Development: A Pit Stop with Gin-Gonic in Golang-Slide.pdfAccelerating API Development: A Pit Stop with Gin-Gonic in Golang-Slide.pdf
Accelerating API Development: A Pit Stop with Gin-Gonic in Golang-Slide.pdf
 
Slide-10years.pdf
Slide-10years.pdfSlide-10years.pdf
Slide-10years.pdf
 
Collaborazione, Decisionalità e Gestione della Complessità nel Tempo: cosa ...
Collaborazione, Decisionalità e Gestione della Complessità nel Tempo: cosa ...Collaborazione, Decisionalità e Gestione della Complessità nel Tempo: cosa ...
Collaborazione, Decisionalità e Gestione della Complessità nel Tempo: cosa ...
 
Vue.js slots.pdf
Vue.js slots.pdfVue.js slots.pdf
Vue.js slots.pdf
 
Commit - Qwik il framework che ti stupirà.pptx
Commit - Qwik il framework che ti stupirà.pptxCommit - Qwik il framework che ti stupirà.pptx
Commit - Qwik il framework che ti stupirà.pptx
 
Sviluppare da zero una Angular Web App per la PA
Sviluppare da zero una Angular Web App per la PASviluppare da zero una Angular Web App per la PA
Sviluppare da zero una Angular Web App per la PA
 
Backstage l'Internal Developer Portal Open Source per una migliore Developer ...
Backstage l'Internal Developer Portal Open Source per una migliore Developer ...Backstage l'Internal Developer Portal Open Source per una migliore Developer ...
Backstage l'Internal Developer Portal Open Source per una migliore Developer ...
 
Prisma the ORM that node was waiting for
Prisma the ORM that node was waiting forPrisma the ORM that node was waiting for
Prisma the ORM that node was waiting for
 
Decision-making for Software Development Teams - Commit University
Decision-making for Software Development Teams - Commit UniversityDecision-making for Software Development Teams - Commit University
Decision-making for Software Development Teams - Commit University
 
Component Design Pattern nei Game Engine.pdf
Component Design Pattern nei Game Engine.pdfComponent Design Pattern nei Game Engine.pdf
Component Design Pattern nei Game Engine.pdf
 
Un viaggio alla scoperta dei Language Models e dell’intelligenza artificiale ...
Un viaggio alla scoperta dei Language Models e dell’intelligenza artificiale ...Un viaggio alla scoperta dei Language Models e dell’intelligenza artificiale ...
Un viaggio alla scoperta dei Language Models e dell’intelligenza artificiale ...
 
Prototipazione Low-Code con AWS Step Functions
Prototipazione Low-Code con AWS Step FunctionsPrototipazione Low-Code con AWS Step Functions
Prototipazione Low-Code con AWS Step Functions
 
KMM survival guide: how to tackle struggles between Kotlin and Swift
KMM survival guide: how to tackle struggles between Kotlin and SwiftKMM survival guide: how to tackle struggles between Kotlin and Swift
KMM survival guide: how to tackle struggles between Kotlin and Swift
 
Da Vuex a Pinia: come fare la migrazione
Da Vuex a Pinia: come fare la migrazioneDa Vuex a Pinia: come fare la migrazione
Da Vuex a Pinia: come fare la migrazione
 
Orchestrare Micro-frontend con micro-lc
Orchestrare Micro-frontend con micro-lcOrchestrare Micro-frontend con micro-lc
Orchestrare Micro-frontend con micro-lc
 
Fastify has defeated Lagacy-Code
Fastify has defeated Lagacy-CodeFastify has defeated Lagacy-Code
Fastify has defeated Lagacy-Code
 
SwiftUI vs UIKit
SwiftUI vs UIKitSwiftUI vs UIKit
SwiftUI vs UIKit
 

AngularJS On Rails by Daniele Spinosa

  • 1. AngularJS on Rails Come integrare AngularJS in un'applicazione Rails senza essere insultati dagli altri sviluppatori.
  • 2. Quando programmi, non c'è differenza tra te e un cinghiale! 1 SconosciutoToscano
  • 3.
  • 4. Creare una API json in RoR per dialogare con AngularJS
  • 5. AngularJS: API racchiusa in un Service definire una 'resource' intorno alla rotta della API LegoSet = $resource("/api/v1/lego_sets/:id", {id: "@id"}, ...)
  • 6. API + versioning # routes.rb namespace :api, defaults: {format: 'json'} do namespace :v1 do resources :lego_sets, only: [:index, :show] do resources :lego_parts, only: [:show] end end end GET http://lego_app.com/api/v1/lego_sets/ GET http://lego_app.com/api/v1/lego_sets/21103 GET http://lego_app.com/api/v1/lego_parts/3001
  • 7. app `--controllers |-- api | `-- v1 | |-- lego_sets_controller.rb | `-- lego_parts_controller.rb |-- application_controller.rb /app/controllers/api/v1/lego_sets_controller.rb module Api::V1 class LegoSetsController < ApplicationController respond_to :json def index respond_with LegoSet.all end def show respond_with LegoSet.find(params[:id]) end end end
  • 8. Rails 4 request params Protezione dal mass-assignment spostata nel controller. Utile creare un helper method def safe_lego_set_params def safe_params params.require(:lego_set).permit(:set_id, :piece_id, :num, ...) end end
  • 9. Si puo agire direttamente nel Layout app/views/layouts/application.html.erb ... <head> <%= javascript_include_tag "//ajax.googleapis.com/ajax/libs/angularjs/1.2.0/angular.min.js" %> <%= javascript_include_tag "//ajax.googleapis.com/ajax/libs/angularjs/1.2.0/angular-resource.min.js" %> </head> Rapido ma molto da cinghiale...
  • 10. Si può usare l'asset pipeline I files di angular possono essere inseriti manualmente in app/assets/javascripts/application.js //= require jquery //= require jquery_ujs ... //= require lib/angular.min //= require lib/angular.resource //= require <nome_app_angular> ...
  • 11. La soluzione per tutte le stagioni gem angularjs-rails bundle quindi //= require angular oppure, se si vuole usare la versione instabile //= require unstable/angular
  • 12. Indipendentemente dalla soluzione adottata è necessario prendere alcune precauzioni per evitare grattacapi in produzione.
  • 13. Proteggere il codice Angular (1) 1. Mangle: false disabilitare il renaming delle variabili (mangle) # nel file config/environments/production.rb config.assets.js_compressor = Uglifier.new(mangle: false)
  • 14. Proteggere il codice Angular (2) 2. depenency injection naming Specificare i nomi degli argomenti in ogni funzione che accetta 'services' ad es.: @LegoCtrl = ("$scope", "LegoSet", $scope, LegoSet) -> angular.module('LegoApp').factory 'LegoSet', [ $resource, ($resource) -> ...] ^ ^
  • 15. Proteggere il codice Angular (3) 3. usare una gemma gem 'ngannotate-rails' https://github.com/kikonen/ngannotate-rails
  • 16. Strutturare il codice JS (1) require risorse angular dopo i turbolinks e prima di tree // app/assets/javascript/application.js //= require jquery //= require jquery_ujs //= require turbolinks //= require lib/angular.min //= require lib/angular.resource //= require <nome_app_angular> //= require tree
  • 17. Strutturare il codice JS (2) Ogni app. AngularJS consiste in un modulo principale, controllers, directives e services. Suddividere il codice in cartelle all'interno di app/assets/javascripts: 4 controllers 4 directives 4 services ...E lib per le tutte le altre dipendenze
  • 18. Sfruttare la protezione CSRF di RoR Proteggere l'applicazinone da attacchi cross-site request forgery attraverso un token inserito nella sezione head di ogni pagina. Usare quel token in tutte le API requests. application.js.coffee LegoApp.config ($httpProvider) -> authToken = $("meta[name="csrf-token"]").attr("content") $httpProvider.defaults.headers.common["X-CSRF-TOKEN"] = authToken
  • 19. Usare i turbolinks Non usate il tag ng-app nell'html. Usate page:load application.js.coffee $(document).on 'page:load', -> $('[ng-app]').each -> module = $(this).attr('ng-app') angular.bootstrap(this, [module]) In questo modo l'applicazione AngularJS verrà inizializzata correttamente ogni volta che i turbolinks fanno fetch&replace.
  • 21.
  • 22. Yeoman 4 SPA (single page applications) 4 sviluppatori specializzati in JS 1. rails new lego_app && cd lego_app 2. mkdir angular && cd angular 3. npm install -g yo grunt-cli bower 4. npm install generator-angular generator-karma 5. yo angular 6. npm install && bower install
  • 23.
  • 24. Bower + Grunt (rails senza asset pipeline) 4 molto disaccoppiato 4 perfetto se si prevede un upgrade di Rails
  • 25. rails-assets Proxy tra Bundler e Bower: converte i componenti Bower in rails gems. 1. aggiungere https://rails-assets.org come gem source 2. indicare i componenti Bower da convertire: gem 'rails-assets-BOWER_PACKAGE_NAME' 3. bundle install: recupera il componente dal registro di Bower e lo 'impacchetta' come gem
  • 26. Non usare Rails 4 rails-api 4 Sinatra 4 AngularFire + Firebase 4 NodeJS 4 Go