Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Backbone.js with Rails

I'm currently trying Backbone.js along with a rails app. My problem is, that I don't know how to implement the Backbone controllers and views with my rails app. I've read a lot of tutorials, but they are always using just one controller in backbone.js.

For example, I have two controllers in rails.

  • Activities Controller
    • Includes two views, a google map and a search field. The google map is inserted with a backbone view, the searchfield is in HTML and gets its functionality through a backbone view.
    • The search field should fetch data from my rails model and display markers inside the map.

And the other one is

  • Users Controller
    • Here the users profile is viewed, and I want to add some ajax functionality like updating values and other things

In my application.js I start the app using

var App = {
  Views: {},
  Controllers: {},
  Collections: {},
  init: function() {
      new App.Controllers.Activities();
      new App.Controllers.Users();
      Backbone.history.start();
  }
};

$(function() {
  App.init();
});

The problem is, that I don't need the Activities controller in my User Profile and the Users controller in the Rails Activities controller. How could I solve this? Should I try reading the current URL within javascript and then decide which controller is used? Or should I put the JavaScript file into the application.html.erb and then decide here which controller should be used?

Or is this the wrong way to use backbone.js controllers?

Am I getting sth wrong with the structure of backbone.js? Or am I using the Controllers in a wrong way?

Another question is, how to add little JavaScript, in particular jQuery, functionality through Backbone.js? For example, I want to remove the label inside a field, when the user clicks into the field. Or I want to do some tab-functionality and just toggle the visibility of some elements. Should I create for each element that is using javascript a Backbone view? Or is this overload?

Hope I made myself clear and anybody can help, thx!

like image 211
23tux Avatar asked Mar 06 '11 18:03

23tux


1 Answers

Why not make use of the routes feature Backbone provides to decide which method to call? The activities controller would contain only routes use for activities, the user controller only for the user handling, and so forth. Like this you can instantiate the controller just as you do and the routing will decide what happens based on the current location's hash.

If you can't use links with hashes (or there are no such links on your page), I'd simply name my view containers specific enough to attach events only for the current view when needed.

jQuery plugins etc. belong into views IMO. Same goes for your tabs and input hint toggle.

Update

On a general level (and I would not necessarily recommend doing it this way): If you have two methods:

// should be only called for the 'Foo' controller
function foo() {
  alert("FOO");
};

// should be only called for the 'Bar' controller
function bar() {
  alert("BAR");
};

and want to call only one of them depending on the current Rails controller, create a small helper:

e.g. in you *helpers/application_helper.rb*

def body_class
  controller.controller_name
end

then call this method in your layout file (or header partial):

<body class="<%= body_class %>">
…

and use e.g. jQuery to "split" your JS execution:

if ($('body').hasClass('foo')) {
  foo();
} else if ($('body').hasClass('bar')) {
  bar();
} 
like image 67
polarblau Avatar answered Oct 18 '22 02:10

polarblau