Project

General

Profile

Adding actions to the SettingsController on a plugin

Added by Enrique Garcia over 13 years ago

I'm developing a new plugin that will need a "settings" view.

On that view I'll need to make a couple drop-downs; things like the Project List and the Custom Field for project lists.

If I was developing a normal app, I would just update the Settings controller and add a @pictures and @custom_fields instance variables on a before_filter. But since this is a custom app

I've tried monkeypatching SettingsController like this:

# vendor/plugins/my_plugin/app/controllers/SettingsController.rb

class SettingsController < ApplicationController
  before_filter :calculate_project_custom_fields, :only => :plugin

  private

  def calculate_project_custom_fields
    if params[:id] == 'my_plugin'
      @projects = Projects.all
      @project_custom_fields = CustomField.find_all_by_type('ProjectCustomField')
    end
  end
end

This allows me to reach the Settings page, where I've a form that uses Projects Projects and @project_custom_fields to modify settings (tags reference "settings[something][something]"). When I POST this form, however, I get the following error:

A copy of ApplicationController has been removed from the module tree but is still active!

I've googled this and found one reference saying that this could be solved by making SettingsController "unloadable" - but then I read that this was a deprecated method. And I wouldn't know how to make it unloadable anyway - so I'm stuck.

I guess I could calculate @pictures and @custom_fields directly in the view, but that sounds so un-rails-y.

What's the correct way to get Projects Projects and @project_custom_fields available for my view ?


Replies (3)

RE: Adding actions to the SettingsController on a plugin - Added by Enrique Garcia over 13 years ago

I'm still not able to find a good solution for this.

By they way, am I not receiving answers because I posted on the wrong forum? Should I post to the help forum instead?

Thanks a lot,

Enrique García

RE: Adding actions to the SettingsController on a plugin - Added by Jean-Baptiste Barth over 13 years ago

This is a common error in Engines plugins. It should occur only in dev mode, not in production mode. To solve this, you have to do 3 things iirc :
  • add unloadable to the class being patches
  • add a require_dependency 'the_class_you_are_patching' at the top of your patch
  • require explicitly the file in your init.rb, in a "config.to_prepare" block or "Dispatcher.to_prepare" (it's the same..)

Regarding the last advice, if I were you I wouldn't put the file in app/controllers, but in a custom directory of your choice in lib/. But maybe it has no impact, I let you do your own tests.

I don't have the time to give you much explanations on this, maybe I'll add a wiki page about this problem. You should read Eric's wiki page about these things in the wiki, here: Plugin_Internals

RE: Adding actions to the SettingsController on a plugin - Added by Enrique Garcia over 13 years ago

Hi Jean Baptiste,

I read the file some time ago, when I developed my first plugin. Didn't realize it had been updated with controller-specific information.

I'll try the extend-by-a-module approach, and apply those 3 things if I still get errors.

    (1-3/3)