lib/resourcelogic/singleton.rb in resourcelogic-0.9.0 vs lib/resourcelogic/singleton.rb in resourcelogic-0.10.0

- old
+ new

@@ -2,72 +2,54 @@ # module Resourcelogic module Singleton def self.included(klass) klass.class_eval do - extend Config + add_acts_as_resource_module(Methods) end end - module Config - def singleton(value = nil) - include Methods if value == true - config(:singleton, value) + module Methods + def object + return @object if defined?(@object) + + if singleton? + if !parent? && respond_to?("current_#{model_name}", true) + @object = send("current_#{model_name}") + elsif parent? && parent_object.send(model_name) + @object = parent_object.send(model_name) + else + super + end + else + super + end end - def singleton? - singleton == true - end - end - - module Methods - def self.included(klass) - klass.class_eval do - methods_to_undefine = [:index, :collection, :load_collection, :collection_url, - :collection_path, :hash_for_collection_url, :hash_for_collection_path] - methods_to_undefine.each { |method| undef_method(method) if method_defined?(method) } + def build_object + if singleton? && parent? + scope.send("build_#{model_name}") + else + super end end - private - # Used to fetch the current object in a singleton controller. - # - # By defult this method is able to fetch the current object for resources nested with the :has_one association only. (i.e. /users/1/image # => @user.image) - # In other cases you should override this method and provide your custom code to fetch a singleton resource object, like using a session hash. - # - # class AccountsController < ResourceController::Singleton - # private - # def object - # @object ||= Account.find(session[:account_id]) - # end - # end - # - def object - @object ||= parent? ? end_of_association_chain : nil + def scope + if singleton? && parent? + parent_object + else + super end - - # Returns the :has_one association proxy of the parent. (i.e. /users/1/image # => @user.image) - # - def parent_association - @parent_association ||= parent_object.send(model_name.to_sym) - end - - # Used internally to provide the options to smart_url in a singleton controller. - # - def object_url_options(action_prefix = nil, alternate_object = nil) - [action_prefix] + namespaces + [parent_url_options, route_name.to_sym] - end - - # Builds the object, but doesn't save it, during the new, and create action. - # - def build_object - @object ||= singleton_build_object_base.send parent? ? "build_#{model_name}".to_sym : :new, object_params - end - - # Singleton controllers don't build off of association proxy, so we can't use end_of_association_chain here - # - def singleton_build_object_base - parent? ? parent_object : model - end + end + + # Route alises can only be used for singleton, like account => user. Otherwise the urligence wont work because there is no account model. + def object_url_parts(action = nil, *alternate_object_or_params) + singleton? ? ([action] + contexts_url_parts + [route_name]) : super + end + + # Override me with true to make singleton + def singleton? + false + end end end end