Advanced Rails - Building Industrial-Strength Web Apps in Record Time

(Tuis.) #1

90 | Chapter 3: Rails Plugins


def authenticate_with_http_basic(&login_procedure)
HttpAuthentication::Basic.authenticate(self, &login_procedure)
end

def request_http_basic_authentication(realm = "Application")
HttpAuthentication::Basic.authentication_request(self, realm)
end
end

This works for small plugins, but it can get clunky. The better solution, chosen by
this plugin, is to first create a module named for the plugin (sometimes including the
developer’s name or company to reduce the chance of namespace collisions). Here is
the abridged code for the HTTP Authentication plugin’s class methods:


module HttpAuthentication
module Basic
extend self
module ControllerMethods
def authenticate_or_request_with_http_basic(realm = "Application",
&login_procedure)
authenticate_with_http_basic(&login_procedure) ||
request_http_basic_authentication(realm)
end

def authenticate_with_http_basic(&login_procedure)
HttpAuthentication::Basic.authenticate(self, &login_procedure)
end

def request_http_basic_authentication(realm = "Application")
HttpAuthentication::Basic.authentication_request(self, realm)
end
end
end
end

Now, the methods are self-contained within HttpAuthentication::Basic::
ControllerMethods. A simple statement in the plugin’sinit.rbfile adds the methods to
ActionController::Base:


ActionController::Base.send :include,
HttpAuthentication::Basic::ControllerMethods

Testing Plugins


Like the rest of Rails, plugins have very mature testing facilities. However, plugin
tests usually require a bit more work than standard Rails tests, as the tests are
designed to be run on their own, outside of the Rails framework. Some things to
keep in mind when writing tests for plugins:

Free download pdf