lib/resourcelogic/self.rb in resourcelogic-0.0.12 vs lib/resourcelogic/self.rb in resourcelogic-0.9.0

- old
+ new

@@ -1,148 +1,184 @@ module Resourcelogic module Self def self.included(klass) klass.class_eval do extend Config - add_acts_as_resource_module(UrlParts) + add_acts_as_resource_module(Urls) add_acts_as_resource_module(Reflection) end end module Config def model_name(value = nil) - rw_config(:model_name, value, model_name_from_name) + config(:model_name, value, controller_name.singularize.underscore) end def object_name(value = nil) - rw_config(:object_name, value, model_name_from_name) + config(:object_name, value, controller_name.singularize.underscore) end - private - def model_name_from_name - name.underscore.split("/").first.gsub(/_controller/, "").singularize.underscore.to_sym - end + def route_name(value = nil) + config(:route_name, value, controller_name.singularize.underscore) + end end - module UrlParts + module Urls + def self.included(klass) + klass.helper_method :object_url, :object_path, :hash_for_object_url, :hash_for_object_path, :edit_object_url, :edit_object_path, :hash_for_edit_object_url, + :hash_for_edit_object_path, :new_object_url, :new_object_path, :hash_for_new_object_url, :hash_for_new_object_path, :collection_url, :collection_path, + :hash_for_collection_url, :hash_for_collection_path + end + private - # Used internally to provide the options to smart_url from Urligence. - # - def collection_url_parts(action = nil, url_params = {}) - [action] + contexts_url_parts + [route_name.to_s.pluralize.to_sym, url_params] + def object_url(*objects) # :doc: + smart_url *object_url_options(nil, objects) end + def object_path(*objects) + smart_path *object_url_options(nil, objects) + end + + def hash_for_object_url(*objects) + hash_for_smart_url *object_url_options(nil, objects) + end + + def hash_for_object_path(*objects) + hash_for_smart_path *object_url_options(nil, objects) + end + + def edit_object_url(*objects) + smart_url *object_url_options(:edit, objects) + end + + def edit_object_path(*objects) + smart_path *object_url_options(:edit, objects) + end + + def hash_for_edit_object_url(*objects) + hash_for_smart_url *object_url_options(:edit, objects) + end + + def hash_for_edit_object_path(*objects) + hash_for_smart_path *object_url_options(:edit, objects) + end + + def new_object_url(url_params = {}) + smart_url *new_object_url_options(url_params) + end + + def new_object_path(url_params = {}) + smart_path *new_object_url_options(url_params) + end + + def hash_for_new_object_url(url_params = {}) + hash_for_smart_url *new_object_url_options(url_params) + end + + def hash_for_new_object_path(url_params = {}) + hash_for_smart_path *new_object_url_options(url_params) + end + + def collection_url(url_params = {}) + smart_url *collection_url_options(url_params) + end + + def collection_path(url_params = {}) + smart_path *collection_url_options(url_params) + end + + def hash_for_collection_url(url_params = {}) + hash_for_smart_url *collection_url_options(url_params) + end + + def hash_for_collection_path(url_params = {}) + hash_for_smart_path *collection_url_options(url_params) + end + # Used internally to provide the options to smart_url from Urligence. # - def object_url_parts(action = nil, *alternate_object_or_params) - alternate_object, url_params = identify_object_or_params(alternate_object_or_params) - url_object = alternate_object - url_object = object if url_object.nil? && object && !object.new_record? - object_parts = url_object ? - [route_name, url_object] : - (action == :new || singleton? ? route_name : route_name.to_s.pluralize.to_sym) - [action] + contexts_url_parts + [object_parts, url_params] + def collection_url_options(url_params = {}) + namespaces + [parent_url_options, route_name.to_s.pluralize.to_sym, url_params] end - - def identify_object_or_params(object_or_params) - obj = nil - url_params = {} - if object_or_params.size > 1 - url_params = object_or_params.last if object_or_params.last.is_a?(Hash) - obj = object_or_params.first - elsif object_or_params.first.is_a?(Hash) - url_params = object_or_params.first + + # Used internally to provide the options to smart_url from Urligence. + # + def object_url_options(action_prefix = nil, alternate_object_or_params = nil) + alternate_object = nil + url_params = nil + case alternate_object_or_params + when Array + url_params = alternate_object_or_params.last if alternate_object_or_params.last.is_a?(Hash) + alternate_object = alternate_object_or_params.first + when Hash + url_params = alternate_object_or_params else - obj = object_or_params.first + alternate_object = alternate_object_or_params end - [obj, url_params] + + [action_prefix] + namespaces + [parent_url_options, [route_name.to_sym, alternate_object || (param ? object : nil)], url_params] end + + # Used internally to provide the options to smart_url from Urligence. + # + def new_object_url_options(url_params = {}) + [:new] + namespaces + [parent_url_options, route_name.to_sym, url_params] + end end module Reflection def self.included(klass) - klass.helper_method :model_name, :collection, :object, :path_name, :route_name + klass.helper_method :model_name, :collection, :object end private - def path_name - return @path_name if defined?(@path_name) - path_parts = request.path.split("/") - path_parts.reverse.each do |path_part| - next if path_part.blank? - if model_name_from_path_part(path_part) == model_name - return @path_name = path_part.to_sym - end - end - @path_name = nil - end - - def route_name - return @route_name if defined?(@route_name) - path_parts = request.path.split("/") - path_parts.reverse.each do |path_part| - next if path_part.blank? - if model_name_from_path_part(path_part) == model_name - return @route_name = route_name_from_path_part(path_part) - end - end - @route_name = model_name - end - # Convenience method for the class level model_name method def model_name - @model_name ||= self.class.model_name.to_sym + self.class.model_name end - def model - @model ||= model_name.to_s.camelize.constantize - end - # Convenience method for the class level object_name method def object_name - @object_name ||= self.class.object_name.to_sym + self.class.object_name end + # Convenience method for the class level route_name method + def route_name + self.class.route_name + end + + # The current model for the resource. + def model # :doc: + model_name.to_s.camelize.constantize + end + # The collection for the resource. def collection # :doc: - @collection ||= scope.all + end_of_association_chain.all end # The current paremter than contains the object identifier. - def id # :doc: - params[:id] + def param # :doc: + params[:id] end - def id? - params.key?(:id) - end - # The parameter hash that contains the object attributes. - def attributes - params[object_name] + def object_params + params["#{object_name}"] end - - def attributes? - params.key?(object_name) - end - + # The current member being used. If no param is present, it will look for # a current_#{object_name} method. For example, if you have a UsersController # and its a singleton controller, meaning no identifier is needed, this will # look for a current_user method. If this is not the behavioru you want, simply # overwrite this method. def object # :doc: - @object ||= id? ? find_object : build_object - end - - def build_object - obj = scope.respond_to?(:build) ? scope.build : scope.new - obj.attributes = attributes - obj - end - - def find_object - scope.find(id) + return @object if defined?(@object) + if param.nil? && respond_to?("current_#{object_name}", true) + @object = send("current_#{object_name}") + else + @object = end_of_association_chain.find(param) + end end end end end \ No newline at end of file