This talk covers the options for structuring concurrent Rails and Ember development, strategies for creating backend APIs that work well with Ember apps, and some innovative ideas around deploying your Ember and Rails apps into production.
7 Differences in Development Mindsets Request / response-based Long-lived state Lifetime of state measured in milliseconds Lifetime of state measured in minutes
9 Data Flow in Rails Browser Controller View (Template) Router Model Controller updates / queries models Sends HTML to Browser for to use to create DOM Sends requests via HTTP Generates HTML
10 Router Controller Controller View View Template Model Model Model Model Data flows down from models via bindings Events flow up from view layer to the router Router updates models & controllers based on events Data Flow in Ember
11 Ember Takes Inspiration From Rails ★ Convention over configuration ★ “Look at all the code I’m not writing!” ★ Internal DSLs for expressiveness ★ An engaged, vibrant community
Development Tools: Ember AppKit Rails 18 ★ Based on ember-appkit, from my colleague Stefan Penner, which uses ES6 modules and a custom resolver ★ Used by Tilde & Dockyard ★ Future uncertain
Development Tools: Separate From Rails 19 ★ Separate repo for your Ember app from your Rails app. Proxy in development. ★ Use any build tools, including grunt, gulp, brunch, or broccoli. ★ ember-cli is likely to be the future, still a work-in-progress
Development Tools: Separate From Rails (cont.) 20 ★ Many JS build tools have option to proxy. Set it up to send /api traffic to Rails. ★ Or, run nginx locally and set up proxy rules accordingly.
Development Tools: Tips 21 ★ Development vs. Production builds of Ember ★ Ember Inspector extension for Chrome & Firefox ★ Learn the Chrome Dev Tools. Better.
Analogy to Traditional Rails Data Flow ★ In traditional Rails apps, controllers make instance variables available to be rendered using ERB ★ In a Ember+Rails app, controllers instead serialize these “instance variables” into JSON and make it available to Ember to render 23
CORS ★ It will be much easier to work with your API if your Ember app is served off the same domain as your Rails app is ★ If you must cross domains, check out the rack- cors gem. 30 https://github.com/cyu/rack-cors
33 Simple, but Ember apps changes are as slow to deploy as Rails app changes Rails server Dev or CI API requests dynamic Rails pages HTML for JS App JS for JS App CSS, Images for JS App AWS Cloudfront Deploy Rails app code, HTML, JS, CSS, images
34 More complex, but fast to deploy Static assets server (AWS S3) Rails server Dev or CI Deploy JS, CSS, images (additive) API requests dynamic Rails pages HTML for JS App JS for JS App CSS, Images for JS App Deploy HTML AWS Cloudfront Deploy Rails app code https://speakerdeck.com/lukemelia/lightning-fast-deployment-of-your-rails-backed-javascript-app
“If I have MVC on the server and MVC on the client, am I doing double the work?” (cont.) 37 ★ As Andre Malan said, “Your front end is not your back end” ★ Your Rails and Ember apps have separate responsibilities. Duplicated work on client and server is unusual.
“What is the difference between a Rails controller and an Ember controller?” 38 ★ A Rails controller is responsible for doing some queries or work and initiating the rendering of JSON or HTML ★ An Ember controller is more akin to a “view model” or “presenter” in Rails land. It is responsible for presenting bindable data to templates for rendering by proxying models and maintaining non-model state and computed properties.
“Should I match my Ember routes to my Rails routes?” 39 ★ No. ★ Rails routes are typically based on REST principles. ★ Ember routes map to the URLs a users sees as they move through the app and are nested to match the nested structure of the UI.
“How do I implement authentication with Ember?” 40 ★ Simplest: Separate log-in page. Standard Rails cookie-based auth. (Must be on same domain.) ★ More complicated: Token-based authentication. Login with username / password, receive bearer token. Send bearer token in Authorization header with all API requests.
“How do I implement authentication with Ember?” (continued) 41 ★ Most Ember apps have a UserController or MeController to allow routes and other controllers access to information about the current user. https://github.com/simplabs/ember-simple-auth
“How do I implement authentication with Ember?” (continued) 42 ★ Tips ★ Consider ember-simple-auth, plus ember- simple-auth-devise. ★ Use HTTPS. https://github.com/simplabs/ember-simple-auth