2013-10-12 08:48:18 -04:00
# Paloma
2014-02-15 06:25:44 -05:00
**This README is for Paloma 4 only.**
2013-10-12 10:20:10 -04:00
2014-02-15 06:25:44 -05:00
**For version 3 README please go [here ](https://github.com/kbparagua/paloma/blob/3.0/README.md ).**
2013-10-12 08:48:18 -04:00
2014-02-15 06:25:44 -05:00
**For version 2 README please go [here ](https://github.com/kbparagua/paloma/blob/2.0/README.md ).**
2013-10-12 08:48:18 -04:00
2014-02-15 06:25:44 -05:00
## Paloma 4, why so sudden?
The last major version (v3) of Paloma introduced a major paradigm shift, and it took me a while to realize that some of the major changes introduced are not really that good and needed to be removed.
## What's new?
*(compared to version 2)*
It is now simpler and more flexible. The old callback thingy paradigm is replaced by a `Controller` layer for better abstraction. Generators are also removed, so programmers need not to follow specific directory structure, unlike in the old versions.
2013-10-12 08:48:18 -04:00
2013-10-12 21:59:43 -04:00
Previously, there are generators that create Paloma files, and these files are written in vanilla javascript. Because of that there are some users who are requesting for coffeescript setup. Now since there are no generated files programmers can write their code either by using vanilla javascript or **coffeescript** . Yay!
2014-02-15 06:25:44 -05:00
### Controller
The new paradigm is patterned after Rails Controller, so it is easier to grasp than the old callback paradigm. Basically, you have a Paloma Controller counterpart for every Rails Controller.
2013-10-12 08:48:18 -04:00
2013-10-12 22:08:49 -04:00
### How about Model and View?
2013-10-12 22:52:21 -04:00
It is tempting to convert Paloma 3 to a full-blown MVC or MVP (or whatever) framework. But I've decided to keep it simple and just provide a Controller component as way to execute a specific javascript code per Rails Controller action and give developers freedom on how to handle each action. So you can still have your own Model and View components and just use them in your Paloma Controllers, since a controller is just a middle-man.
2013-10-12 22:08:49 -04:00
2013-10-12 08:48:18 -04:00
## Advantages
* Choose what specific javascript code to run per page.
2013-01-25 22:08:50 -05:00
* Easily make ruby variables available on your javascript files.
2012-12-19 02:56:52 -05:00
2013-10-12 08:55:14 -04:00
2013-10-12 08:48:18 -04:00
## Quick Example
2012-12-19 02:56:52 -05:00
2013-10-12 08:55:14 -04:00
Paloma controller.
2012-12-19 02:56:52 -05:00
```javascript
2013-10-12 09:05:06 -04:00
var UsersController = Paloma.controller('Users');
2013-10-12 08:55:14 -04:00
2013-10-12 22:39:27 -04:00
// Executes when Rails User#new is executed.
2013-10-12 09:05:06 -04:00
UsersController.prototype.new = function(){
2013-10-12 08:55:14 -04:00
alert('Hello Sexy User!' );
};
2012-12-19 02:56:52 -05:00
```
The Rails controller `app/controllers/users_controller.rb` :
```ruby
def UsersController < ApplicationController
def new
2013-10-12 22:52:21 -04:00
# a Paloma request will automatically be created.
2013-10-12 09:24:40 -04:00
@user = User.new
2012-12-19 02:56:52 -05:00
end
end
```
That's it! Simply Sexy!
2013-10-12 22:39:27 -04:00
## Minimum Requirements
2012-12-19 02:56:52 -05:00
* jQuery 1.7 or higher
* Rails 3.1 or higher
2012-12-18 04:47:24 -05:00
2013-10-12 08:55:14 -04:00
## Install
2013-10-12 22:39:27 -04:00
* Without bundler: `sudo gem install paloma` .
* With bundler, add this to your Gemfile: `gem 'paloma'`
* Require `paloma` in your `application.js` : `//= require paloma`
2013-10-12 09:12:10 -04:00
2013-10-12 22:39:27 -04:00
## Controllers
2013-10-12 09:05:06 -04:00
2013-10-12 22:52:21 -04:00
Controllers are just classes that handle requests made by Rails Controllers. Each Rails Controller's action will be mapped to a specific Paloma Controller's action.
2013-10-12 09:24:40 -04:00
2013-10-12 22:39:27 -04:00
### Creating a Controller
2013-10-12 09:24:40 -04:00
2014-02-15 06:25:44 -05:00
A Controller constructor is created or accessed (if it already exists), using `Paloma.controller()` method.
2013-10-12 09:24:40 -04:00
```javascript
2013-10-13 06:25:12 -04:00
var ArticlesController = Paloma.controller('Articles');
2013-10-12 09:24:40 -04:00
```
2013-10-12 22:39:27 -04:00
It will return the constructor function of your controller.
2013-10-12 09:24:40 -04:00
2014-02-15 06:25:44 -05:00
Note: Using `Paloma.controller` method, you can access the same controller constructor across different files.
2013-10-12 09:24:40 -04:00
2013-10-12 22:39:27 -04:00
### Handling Actions
2013-10-12 09:24:40 -04:00
2014-02-15 06:34:15 -05:00
Every time a request to Paloma is made (A Rails Controller action is executed), an instance of a Paloma controller is created and the method responsible for the request will be invoked.
2013-10-12 22:39:27 -04:00
2013-10-12 09:24:40 -04:00
```javascript
2013-10-13 06:25:12 -04:00
var ArticlesController = Paloma.controller('Articles');
2013-10-12 09:24:40 -04:00
ArticlesController.prototype.new = function(){
// Handle new articles
};
ArticlesController.prototype.edit = function(){
// Handle edit articles
};
```
2013-10-12 09:05:06 -04:00
2014-02-15 06:34:15 -05:00
## Advanced Usage
2014-02-15 07:08:17 -05:00
You can manipulate what controller/action should Paloma execute by calling `js` method **before** rendering.
2014-02-15 06:34:15 -05:00
1. Changing controller
2014-02-15 07:08:17 -05:00
2014-02-15 06:40:22 -05:00
```ruby
class UsersController < ApplicationController
def new
@user = User.new
js 'Accounts' # will use Accounts controller instead of Users controller
end
end
```
2014-02-15 06:34:15 -05:00
2014-02-15 06:40:22 -05:00
2. Changing action
2014-02-15 07:08:17 -05:00
2014-02-15 06:40:22 -05:00
You can use the symbol syntax:
```ruby
2014-02-15 06:34:15 -05:00
def new
@user = User.new
2014-02-15 06:40:22 -05:00
js :register # will execute register method instead of new
2014-02-15 06:34:15 -05:00
end
2014-02-15 06:40:22 -05:00
```
Or the string syntax:
```ruby
def new
@user = User.new
js '#register'
end
```
2014-02-15 06:34:15 -05:00
2014-02-15 07:08:17 -05:00
3. Changing controller and action.
2014-02-15 06:40:22 -05:00
```ruby
def new
@user = User.new
js 'Accounts#register' # will execute Accounts#register instead of Users#new
end
```
2014-02-15 06:34:15 -05:00
2014-02-15 07:08:17 -05:00
4. Changing controller with namespace.
2014-02-15 06:40:22 -05:00
Paloma supports namespaces using '/' as delimiter.
2014-02-15 06:34:15 -05:00
2014-02-15 06:40:22 -05:00
```ruby
def new
@user = User.new
js `Admin/Accounts` # will use Admin/Accounts controller instead of Users controller
end
```
```ruby
def new
@user = User.new
js 'Admin/Accounts#register' # will execute Admin/Accounts#register instead of Users#new
end
```
2014-02-15 07:08:17 -05:00
## Passing Parameters
You can access the parameters on your Paloma Controller using `this.params` object.
1. Parameters only.
`users_controller.rb`
```ruby
def destroy
user = User.find params[:id]
user.destroy
js :id => user.id
end
```
Paloma controller.
```javascript
var UsersController = Paloma.controller('Users');
UsersController.prototype.destroy = function(){
alert('User ' + this.params['id'] + ' is deleted.');
};
```
2. Path with parameters.
```ruby
def destroy
user = User.find params[:id]
user.destroy
js 'Accounts#delete', :id => user.id
end
```
2013-10-12 22:39:27 -04:00
## Preventing Paloma Execution
2013-03-02 11:15:44 -05:00
2013-10-12 22:39:27 -04:00
If you want to Paloma not to execute in a specific Rails Controller action you need to pass `false` as the Paloma parameter.
2013-03-02 11:15:44 -05:00
2013-10-12 09:36:38 -04:00
```ruby
def edit
@user = User.find params[:id]
js false
end
2013-03-02 11:36:36 -05:00
```
2013-03-02 11:33:26 -05:00
2012-12-19 05:39:30 -05:00
2014-02-15 07:08:17 -05:00
## Controller-wide setup
You can call `js` outside Rails controller actions for global or controller-wide settings.
**Example:**
```ruby
class UsersController < ApplicationController
js 'Accounts' # use Accounts controller instead of Users for all actions.
def new
@user = User.new
end
def show
@user = User.find params[:id]
end
end
```
Like `before_filter` you can also pass `only` and `except` options.
```ruby
class UsersController < ApplicationController
js 'Admin/Accounts', :except => :destroy # Use Admin/Accounts except for destroy method
end
```
**IMPORTANT NOTE:**
If you are going to pass parameters for Controller-wide settings, put them inside a `:params` hash.
```ruby
class UsersController < ApplicationController
js 'Accounts', :params => {:x => 1, :y => 2, :z => 3}, :only => :show
end
```
### Overriding Controller-wide setup
If you want to override the controller-wide setup, just call `js` again inside a controller action. From there you can override the controller/action or pass additional parameters.
```ruby
class UsersController < ApplicationController
js 'Accounts', :params => {:x => 1}
def new
@user = User.new
js :register, :y => 2 # will execute Accounts#register with params {:x => 1, :y => 2}
end
end
```
2013-10-12 09:36:38 -04:00
## Gotchas
2012-12-19 05:39:30 -05:00
2014-06-07 07:34:59 -04:00
* Paloma will execute on all `render` calls, except for calls with the following formats: `js` , `json` , `xml` , and `file` .
2012-12-21 15:10:43 -05:00
2014-05-29 10:52:19 -04:00
Example:
2014-06-07 07:34:59 -04:00
```ruby
render :json => {:x => 1} # Paloma will not execute`
render :partial => '/path/to/partial' # Paloma will execute
```
2013-10-12 09:36:38 -04:00
2014-05-29 10:52:19 -04:00
* It will cause conflicts if you have a controller and a module that has the same name.
Example:
```js
var AdminController = Paloma.controller('Admin');
// This will override the AdminController and replace it
// with a module named 'Admin'.
var UsersController = Paloma.controller('Admin/Users');
```
2013-10-12 09:36:38 -04:00
2013-10-12 10:09:02 -04:00
## Where to put code?
2013-10-12 22:39:27 -04:00
Again, Paloma is now flexible and doesn't force developers to follow specific directory structure.
2014-02-15 07:08:17 -05:00
You have the freedom to create controllers anywhere in your application.
2013-10-12 10:09:02 -04:00
2014-02-15 06:25:44 -05:00
Personally, I prefer having a javascript file for each controller.