Usually in Rails, if you specify a before_filter in the base controller ‘ApplicationController’ (in application.rb), every other controller in that app inherits that filter, so that even if you specify a before_filter in another controller … the filter in application.rb always runs

Example:

class ApplicationController < ActionController::Base before_filter :check_login end class ApplicationController < ActionController::Base before_filter :check_login end

class UploadsController < ApplicationController before_filter :get_data end class UploadsController < ApplicationController before_filter :get_data end

The :check_login method is always run even though UploadsController specifies another before_filter.

(You can stop this behavior by specifying a skip_before_filter :check_login in the Uploads Controller)

However if you take this mindset with you to cakephp you’re in for a frustrating time. Because if you do something like this like this …

class AppController extends Controller { function beforeFilter ( ) { if ( $this -> Session -> read ( 'authenticated' ) != 'true' ) : $this -> redirect ( '/login' ) ; endif ; } } class AppController extends Controller{ function beforeFilter(){ if($this->Session->read('authenticated') != 'true'): $this->redirect('/login'); endif; } }

class UploadsController extends AppController { function beforeFilter ( ) { $this -> set ( 'file_categories' , $this -> FileCategory -> find ( 'list' , array ( 'order' => 'name' ) ) ) ; } } class UploadsController extends AppController{ function beforeFilter(){ $this->set('file_categories', $this->FileCategory->find('list', array('order' => 'name'))); } }

… you’re going to be left wondering why your very hastily thrown together authentication scheme, doesn’t work on the Uploads controller :\

Because the beforeFilter specified in each controller completely *overrides* the one from its parent (in php Object oriented programming, methods in child classes override the matching method in the parent), what you have to do *in PHP* is call the beforeFilter of the parent controller, first, before doing what you want to do.

So instead of the above, you do this …(note the emphasis)