Living on the Edge

Streamlined Support for Namespaced Controllers

Posted on February 26, 2007

Recently I’ve been spending a lot of time with Streamlined. The product is coming along quite well and recently a plugin version was released. One of the things that bugged me was lack of support for namespaced controllers. There’s a lot of controversary about namespaced controllers within the Rails community, but I’ve never had an issue with them and they help to provide good separation with larger projects. In the case of Streamlined, I’m using namespaced controllers for all of my administration pages. This results in a url like:

http://blog.railsconsulting.com/admin/categories

In addition to good separation namespaced controllers also insulate my own controllers from stepping on / or getting stepped on an acts_as_streamlined controller.

Anyway, enough justification. Correcting the namespaced issue is pretty simple. The problem is in the lib/streamlined_controller.rb file. The issues is how the streamlined code is arriving at the model name. Around line 404 in the file there is the following line:

@model_name ||= Inflector.singularize(self.class.name.chomp("Controller"))

What’s going on here is that in the original code it is taking the controller class name and getting rid of Controller from the end of it. In the case of a controller named UsersController this will result in a model name of User, which is correct. In the case of a namespaced controller named Admin::UserController the code results in a model named AdminUser, which obviously is not correct.

By changing it to read the following it will correct the problem:

@model_name ||= Inflector.classify(self.class.controller_name)

By referencing the internal method controller_name we will get back the correct controller name, sans the namespace, which in turn results in the correct model name.

Streamlined Plugin ArgumentError

Posted on February 25, 2007

If you’re receiving this error when using the streamlined plugin, I might have a solution for you:

“A copy of AuthenticatedSystem has been removed from the module tree but is still active!”

It’s taken me several hours of investigation but I found something that works. The issue is that in Rails 1.2 the order of initialization has changed. You can find a lot more information about this from Rick Olson’s blog.

The issue is that the PlugIns load before the application itself. Therefore the PlugIns cannot refer to the application or monkey patch it.

To correct this problem in streamlined we only need to comment out two lines; the require line to the application.rb file and the line that reminds us not to act_as_streamlined from the ApplicationController directly. The beginning of the module should look like the following:

#require "#{RAILS_ROOT}/app/controllers/application"
module StreamlinedController 
  def self.included(base) 
    #raise "Cannot extend ApplicationController with acts_as_streamlined: please extend individual controllers." if base.instance_of? ApplicationController 
    base.extend(ClassMethods) 
  end

The problem with these lines is that they are referring to the ApplicationController which creates a dependency between streamlined and the ApplicationController. As I understand it prevents its dependencies from being unloadable.

I’ve done some preliminary testing and it appears to be working fine. I will continue with some more thorough testing and report back if there are problems.