module Resourceful module Default # This file contains various methods to make URL helpers less painful. # They provide methods analogous to the standard foo_url and foo_path helpers. # However, they use make_resourceful's knowledge of the structure of the controller # to allow you to avoid figuring out which method to call and which parent objects it should be passed. module URLs # This returns the path for the given object, # by default current_object[link:classes/Resourceful/Default/Accessors.html#M000012]. # For example, in HatsController the following are equivalent: # # object_path #=> "/hats/12" # hat_path(@hat) #=> "/hats/12" # def object_path(object = current_object); object_route(object, 'path'); end # Same as object_path, but with the protocol and hostname. def object_url (object = current_object); object_route(object, 'url'); end # This is the same as object_path, # unless a parent exists. # Then it returns the nested path for the object. # For example, in HatsController where Person has_many :hats and params[:person_id] == 42, # the following are equivalent: # # nested_object_path #=> "/person/42/hats/12" # person_hat_path(@person, @hat) #=> "/person/42/hats/12" # def nested_object_path(object = current_object); nested_object_route(object, 'path'); end # Same as nested_object_path, but with the protocol and hostname. def nested_object_url (object = current_object); nested_object_route(object, 'url'); end # This returns the path for the edit action for the given object, # by default current_object[link:classes/Resourceful/Default/Accessors.html#M000012]. # For example, in HatsController the following are equivalent: # # edit_object_path #=> "/hats/12/edit" # edit_person_hat_path(@person, @hat) #=> "/hats/12/edit" # def edit_object_path(object = current_object); edit_object_route(object, 'path'); end # Same as edit_object_path, but with the protocol and hostname. def edit_object_url (object = current_object); edit_object_route(object, 'url'); end # This returns the path for the collection of the current controller. # For example, in HatsController where Person has_many :hats and params[:person_id] == 42, # the following are equivalent: # # objects_path #=> "/people/42/hats" # person_hats_path(@person) #=> "/people/42/hats" # def objects_path; objects_route('path'); end # Same as objects_path, but with the protocol and hostname. def objects_url ; objects_route('url'); end # This returns the path for the new action for the current controller. # For example, in HatsController where Person has_many :hats and params[:person_id] == 42, # the following are equivalent: # # new_object_path #=> "/people/42/hats/new" # new_person_hat_path(@person) #=> "/people/42/hats/new" # def new_object_path; new_object_route('path'); end # Same as new_object_path, but with the protocol and hostname. def new_object_url ; new_object_route('url'); end # This returns the path for the parent object. # def parent_path(object = parent_object) instance_route(parent_class_name.underscore, object, 'path') end # Same as parent_path, but with the protocol and hostname. def parent_url(object = parent_object) instance_route(parent_class_name.underscore, object, 'url') end # This prefix is added to the Rails URL helper names # before they're called. # By default, it's the underscored list of namespaces of the current controller, # or nil if there are no namespaces defined. # However, it can be overridden if another prefix is needed. # Note that if this is overridden, # the new method should return a string ending in an underscore. # # For example, in Admin::Content::PagesController: # # url_helper_prefix #=> "admin_content_" # # Then object_path is the same as admin_content_page_path(current_object). def url_helper_prefix namespaces.empty? ? nil : "#{namespaces.join('_')}_" end # This prefix is added to the Rails URL helper names # for the make_resourceful collection URL helpers, # objects_path and new_object_path. # By default, it's the parent name followed by an underscore if a parent # is given, and the empty string otherwise. # # See also url_helper_prefix. def collection_url_prefix parent? ? "#{parent_class_name.underscore}_" : '' end private def object_route(object, type) instance_route(current_model_name.underscore, object, type) end def nested_object_route(object, type) return object_route(object, type) unless parent? send("#{url_helper_prefix}#{parent_class_name.underscore}_#{current_model_name.underscore}_#{type}", parent_object, object) end def edit_object_route(object, type) instance_route(current_model_name.underscore, object, type, "edit") end def objects_route(type) collection_route(current_model_name.pluralize.underscore, type) end def new_object_route(type) collection_route(current_model_name.underscore, type, "new") end def instance_route(name, object, type, action = nil) send("#{action ? action + '_' : ''}#{url_helper_prefix}#{collection_url_prefix unless shallow?}#{name}_#{type}", *(parent? && !shallow? ? [parent_object, object] : [object])) end def collection_route(name, type, action = nil) send("#{action ? action + '_' : ''}#{url_helper_prefix}#{collection_url_prefix}#{name}_#{type}", *(parent? ? [parent_object] : [])) end end end end