Since last week, I've had some really great user feedback from the community. From that feedback, four new features made it in to this week's release. Here they are.
Support for Custom Route Names
Osh let me know that r_c didn't really support non-standard resource names. That is, it wasn't possible to have a controller whose name didn't match its model. Now, not only does r_c support non-standard resource names, but it supports every configuration of non-standard resources imaginable.
Osh's example was the simplest, and probably the most common. He has a resource with a name that doesnt't match the model. In that case, all you have to do is override model_name.
class TagsController < ResourceController::Base private def model_name 'photo_tag' end end
In that example, the variables, and form_builders available in your views would be named photo_tag(s). If you wanted to change that to match the name of your model, you'd override object_name.
class TagsController < ResourceController::Base private def model_name 'photo_tag' end def object_name 'photo_tag' end end
Your controller might have some non-standard name, too. If it does, just override route_name.
## routes.rb map.resources :tags, :controller => "photo_tags" ## photo_tags_controller.rb class PhotoTagsController < ResourceController::Base private def route_name 'tag' end end
All of those new helpers default to the value of the resource_name helper, which is derived from the name of the controller.
New Urligence Syntax
In order to support non-standard routes in resource_controller, Urligence has gained some new syntax. smart_url infers the name of a resource from an object's class name, so a non-standard route name was impossible. Now, if you provide a 2-element array parameter to smart_url, the first element (a symbol) is used as the resource name, and the second element is the object that is passed to the url helper. It looks like this...
All of the old syntax is still, of course, valid, and can be mixed and matched with the new syntax.
hash_for, path, and url
On the topic of Urligence, Hsiu-Fan raised the issue that smart_url would only return paths. Not really an accurate method name, and not convenient if you want a URL, or a hash. Hsiu-Fan was also nice enough to send in a patch, which I refactored a bit, and now we have four methods.
smart_url smart_path hash_for_smart_url hash_for_smart_path
Important: The smart_url method now outputs URLs, not paths. If you are depending on paths coming out of smart_url anywhere in your code, or tests, this may be a code breaking change.
r_c has also gained helpers for all of these methods...
# object [new_|edit_]object_url [new_|edit_]object_path hash_for_[new_|edit_]object_url hash_for_[new_|edit_]object_path # collection collection_url collection_path hash_for_collection_url hash_for_collection_path
New Instantiation Syntax
Another thing Osh brought up with me, during our back and forth, was his concern with r_c's inheritance syntax. Since there isn't any particular reason for that syntax other than the fact that I like it, I have added an alternative. Just say resource_controller, and you'll get the exact same effect as inheriting from ResourceController::Base.
class PhotosController < ApplicationController resource_controller end
Just make sure that you call the resource_controller method before you use any other r_c features.
svn export http://svn.jamesgolick.com/resource_controller/tags/stable vendor/plugins/resource_controller
Edge/Rails 2.0 Compatible
svn export http://svn.jamesgolick.com/resource_controller/tags/edge_compatible/stable vendor/plugins/resource_controller
If you're looking for older versions, try browsing http://svn.jamesgolick.com/resource_controller/tags.
For more info, see the resource_controller section of my blog.
Come join the discussion on the mailing list.