Hi all,
I am trying to create my own plugin, and I’m not having much luck. I
have
my structure set up with my controller, models and views. I’ve been
able to
successfully migrate my database, however I can’t get my routes to work.
I
have the following basic directory structure
plugins
± project_ranking
±controllers
| ±project_rank_controller.rb
+models
| ±project_rank.rb
+views
| ±order.rhtml
+routes.rb
I’m trying to create a new route, and here is what I’ve defined in my
routes.rb file.
ActionController::Routing::Routes.draw do |map|
connect ‘projects/order’, :controller => ‘project_rank`’, :action =>
‘order’
end
Here is what I’ve added to the base project’s routes.rb
map.home ‘’, :controller => ‘welcome’
#my new routing
map.from_plugin :project_ranking
Other routes
However, when I try to load the default projects page (not a plugin). I
receive the following routing errors
“no route found to match “/” with {:method=>:get}”
If I comment out my map.from_plugin, everything works fine again.
Any advice/help would be great.
Thanks,
Todd
The routes.rb file in your plugin should only contain the inner
section of a normal application routes.rb file, I.e.
connect ‘/path/:parameters’, :controller => ‘plugin_controller’
Note that it doesn’t even contain the ‘map’.
HTH
James
Thanks James! That fixed part of my problem. I’m successfully getting
my
routes to work now. However, it seems that my controller is never
called,
and I’m now receiving a 404 error instead of the apps layout with
“hello!”
in the body as I expected. The application I’m creating a plugin for is
redmine. It uses site layouts and the standard “<%= yield %>” code for
the
body that is rendered from the called controller/action/view. I simply
have
the following in my controller,and view, am I missing something else? I
set
the order action to be called when the projects/order url is called.
routes.rb
connect ‘projects/order’, :controller => ‘project_rank’, :action =>
‘order’
project_rank_controller.rb
class ProjectRankController < ProjectsController
def order
print ‘foobar’;
end
end
order.rhtml
hello!
Thanks,
Todd
I think you could extend ProjectsController - but it would mean that
your ProjectRankController is a ProjectsController. So, for example,
I am not sure it would automatically know about your project_rank
model - it might just know about the project model.
Quoting Todd N. [email protected]:
Well, just a follow up. I fixed my issue by extending
“ApplicationController”. When I extend “ProjectsController” which is
part
of the base app, everything blows up. Are we not allowed to extend code
from the base app in rails engine?
Todd
Hi Cynthia,
I tried changing my controller to the following.
require_dependency “projects_controller”
class ProjectRankController < ProjectsController
layout ‘base’
#require a manager to update priorities
before_filter :require_manager, :only => :update
before_filter :authorize, :except => :order
…
end
However when I try my overridden “list” action, it doesn’t work with the
projects controller routes. The default is “projects/list”, but my list
action never gets called. If my Project Rank Controller is a Project
controller, do I still have to change the routes to call my subclass?
Thanks,
Todd