Hey ! (I wrote this answer pretty quickly, sorry if there are any mistake) Fortunately, Backbone is very mature so a lot of resources you will find online are going to be pretty updated.
> should I be using CoffeeScript now that ECMA2015 is here? (new for me)
I advise you don't. Coffeescript has strongly influenced the shape of ES2015, meaning a lot of the great features of Coffeescript can be found in ES2015. You can easily use ES2015 with a tool like Babel.
> should I be using Underscore for templating? (new for me)
This is fine for small and quick usage. If you plan to have a somewhat complex application, I would advise to use Handlebars.
Underscore templating is great, but if feels as bad as PHP. Handlebars provides a lot of unavoidable features like partials and helpers that makes everything cleaner and more maintainable.
Exemple:
Underscore
<% _.forEach(items, function(item){ %> <%= item.name %> <%= }); %>
Handlebars
{{#each items }} {{name}} {{/each}}
> I'd feel most comfortable with a Rails backend. Is the Rails-Backbone gem a good path to go down?
Backbone is completely agnostic of your Backend, you are free to choose the one you are the most comfortable with. Note that Backbone was originally developped for a Rail Application
> any particular Backbone+Rails tutorials that you feel are current?
I used Developing Backbone.js Applications myself. There are tons of good resources about Backbone, and as I said above, it hasn't changed much in the last few years (The library is very mature).
EDIT: Adding: Industry standard regarding Backbone will not be as strict as, say, an Angular application. As for any javascript application, you will be expected to write clean, tested and re-usable code.
Backbone models don't need to have a URL, no. Without one, it won't be possible to sync that model directly to an API (using the built-in sync method), but it sounds like that might not be necessary for you.
For example, from the Backbone docs:
var Sidebar = Backbone.Model.extend({ promptColor: function() { var cssColor = prompt("Please enter a CSS color:"); this.set({color: cssColor}); } });
>In the view, I have to render the collection everytime it's updated
Well, how about something like this in your views:
initialize: function(options) { this.listenTo(this.collection, "add remove sync", this.render); // other stuff },
I haven't looked for tutorials, but the backbone source is short enough that I just scan through it when I don't understand what's going on. I really recommend you read the annotated source though, because there's not actually as much magic going on as you might suspect. Once you read it, you'll have a sense for what you can override and what you can't, and what all the magic is. Here's an example of what I mean:
var View = Backbone.View = function(options) { this.cid = _.uniqueId('view'); options || (options = {}); _.extend(this, _.pick(options, viewOptions)); this._ensureElement(); this.initialize.apply(this, arguments); this.delegateEvents(); };
var viewOptions = ['model', 'collection', 'el', 'id', 'attributes', 'className', 'tagName', 'events'];
Not a great deal of magic takes place when you create a view:
The view gets an id used for keeping track of it in various ways
Some of the properties of the options object end up attached to the view instance
Some element is designated as the placeholder of the view
Your initialize function is called
Your event handlers are handed over to jQuery
So you see, there's plenty of room to customize that behavior. If you want your initialize function to instantiate a collection and have that collection's fetch success function render a template, you can encapsulate all that in a reusable view. Everyone seems to have a different style of using this framework, so just experiment with it until you're satisfied.
I'll recommend you to see how app has been build here - http://todomvc.com/examples/backbone/ There are source codes and working example. It's small, so you can fast understand what's going on there. Also don't forget about doc - http://backbonejs.org/