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
AngularJS On Rails by Daniele Spinosa
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
AngularJS On Rails by Daniele Spinosa
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
AngularJS On Rails by Daniele Spinosa
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

More Related Content

PPTX
Angular js: routing
PPTX
AngularJS – Reinventare le applicazioni web
PPTX
AngularJS: server communication
PPTX
Fe04 angular js-101
PDF
Angularjs
PPTX
Corso 3 giorni Angular 2+
PDF
DrupalDay 2014: AngularJS + IonicFramework + Drupal Services
PDF
DDAY2014 - Costruire una app mobile con Ionic, AngularJS ed ovviamente Drupal
Angular js: routing
AngularJS – Reinventare le applicazioni web
AngularJS: server communication
Fe04 angular js-101
Angularjs
Corso 3 giorni Angular 2+
DrupalDay 2014: AngularJS + IonicFramework + Drupal Services
DDAY2014 - Costruire una app mobile con Ionic, AngularJS ed ovviamente Drupal

Similar to AngularJS On Rails by Daniele Spinosa (6)

PDF
Tech Webinar: Advanced AngularJS, tecniche avanzate per padroneggiare il fram...
PDF
Angular 4 - convertire o migrare un'applicazione Angularjs
PDF
Introduzione ad angular 7/8
PDF
Acadevmy - Angular Overview
ODP
Corso angular js componenti
PPTX
Open Day June 17th Creare componenti AngularJS riutilizzabili tra applicazioni
Tech Webinar: Advanced AngularJS, tecniche avanzate per padroneggiare il fram...
Angular 4 - convertire o migrare un'applicazione Angularjs
Introduzione ad angular 7/8
Acadevmy - Angular Overview
Corso angular js componenti
Open Day June 17th Creare componenti AngularJS riutilizzabili tra applicazioni
Ad

More from Commit University (20)

PDF
Accessibilità ed equità digitale: un impegno, non una scelta
PDF
GitHub Copilot:vediamo chi comanda - Commit University.pdf
PDF
Contract Driven Development - Branch 2024.pdf
PPTX
Cybersecurity & AI: Illusioni e Speranze
PDF
Migliorare la Developer Experience in un mondo Cloud Native
PPTX
Scopri come sfruttare la potenza della Hybrid RAG
PDF
Introduzione a AWS Forecast e SageMaker DeepAR: Prevedere la Domanda con il M...
PDF
Oltre l'hype: vulnerabilità e limiti dell'intelligenza artificiale.pdf
PPTX
Alla scoperta dei Vector Database e dei RAG
PDF
Nell’iperspazio con Rocket: il Framework Web di Rust!
PDF
Crea il tuo assistente AI con lo Stregatto (open source python framework)
PDF
Breaking REST Chains_ A Fastify & Mercurius Pathway to GraphQL Glory.pdf
PDF
Accelerating API Development: A Pit Stop with Gin-Gonic in Golang-Slide.pdf
PDF
Slide-10years.pdf
PDF
Collaborazione, Decisionalità e Gestione della Complessità nel Tempo: cosa ...
PDF
Vue.js slots.pdf
PPTX
Commit - Qwik il framework che ti stupirà.pptx
PPTX
Sviluppare da zero una Angular Web App per la PA
PDF
Backstage l'Internal Developer Portal Open Source per una migliore Developer ...
PDF
Prisma the ORM that node was waiting for
Accessibilità ed equità digitale: un impegno, non una scelta
GitHub Copilot:vediamo chi comanda - Commit University.pdf
Contract Driven Development - Branch 2024.pdf
Cybersecurity & AI: Illusioni e Speranze
Migliorare la Developer Experience in un mondo Cloud Native
Scopri come sfruttare la potenza della Hybrid RAG
Introduzione a AWS Forecast e SageMaker DeepAR: Prevedere la Domanda con il M...
Oltre l'hype: vulnerabilità e limiti dell'intelligenza artificiale.pdf
Alla scoperta dei Vector Database e dei RAG
Nell’iperspazio con Rocket: il Framework Web di Rust!
Crea il tuo assistente AI con lo Stregatto (open source python framework)
Breaking REST Chains_ A Fastify & Mercurius Pathway to GraphQL Glory.pdf
Accelerating API Development: A Pit Stop with Gin-Gonic in Golang-Slide.pdf
Slide-10years.pdf
Collaborazione, Decisionalità e Gestione della Complessità nel Tempo: cosa ...
Vue.js slots.pdf
Commit - Qwik il framework che ti stupirà.pptx
Sviluppare da zero una Angular Web App per la PA
Backstage l'Internal Developer Portal Open Source per una migliore Developer ...
Prisma the ORM that node was waiting for
Ad

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
  • 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.
  • 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
  • 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