module ActiveAdmin::ResourceController::DataAccess
This module overrides most of the data access methods in Inherited Resources to provide Active Admin with it’s data.
The module also deals with authorization and resource callbacks.
Constants
- COLLECTION_APPLIES
Public Class Methods
Source
# File lib/active_admin/resource_controller/data_access.rb, line 12 def self.included(base) base.class_exec do include Callbacks include ScopeChain define_active_admin_callbacks :build, :create, :update, :save, :destroy helper_method :current_scope end end
Protected Instance Methods
Source
# File lib/active_admin/resource_controller/data_access.rb, line 312 def apply_decorations(resource) apply_decorator(resource) end
@param resource [ActiveRecord::Base] @return [ActiveRecord::Base] resource
Source
# File lib/active_admin/resource_controller/data_access.rb, line 217 def apply_filtering(chain) @search = chain.ransack(params[:q] || {}) @search.result end
Applies any Ransack search methods to the currently scoped collection. Both ‘search` and `ransack` are provided, but we use `ransack` to prevent conflicts.
Source
# File lib/active_admin/resource_controller/data_access.rb, line 232 def apply_includes(chain) if active_admin_config.includes.any? chain.includes *active_admin_config.includes else chain end end
Source
# File lib/active_admin/resource_controller/data_access.rb, line 252 def apply_pagination(chain) # skip pagination if CSV format was requested return chain if params["format"] == "csv" # skip pagination if already was paginated by scope return chain if chain.respond_to?(:total_pages) page = params[Kaminari.config.param_name] paginate(chain, page, per_page) end
Source
# File lib/active_admin/resource_controller/data_access.rb, line 222 def apply_scoping(chain) @collection_before_scope = chain if current_scope scope_chain(current_scope, chain) else chain end end
Source
# File lib/active_admin/resource_controller/data_access.rb, line 204 def apply_sorting(chain) params[:order] ||= active_admin_config.sort_order order_clause = active_admin_config.order_clause.new(active_admin_config, params[:order]) if order_clause.valid? order_clause.apply(chain) else chain # just return the chain end end
Source
# File lib/active_admin/resource_controller/data_access.rb, line 299 def assign_attributes(resource, attributes) if resource.respond_to?(:assign_attributes) resource.assign_attributes(*attributes) else resource.attributes = attributes[0] end resource end
@param resource [ActiveRecord::Base] @param attributes [Array<Hash] @return [ActiveRecord::Base] resource
Source
# File lib/active_admin/resource_controller/data_access.rb, line 131 def build_new_resource apply_authorization_scope(scoped_collection).send( method_for_build, *resource_params.map { |params| params.slice(active_admin_config.resource_class.inheritance_column) } ) end
Builds a new resource. This method uses the method_for_build provided by Inherited Resources.
@return [ActiveRecord::Base] An un-saved active record base object
Source
# File lib/active_admin/resource_controller/data_access.rb, line 115 def build_resource get_resource_ivar || begin resource = build_new_resource resource = apply_decorations(resource) resource = assign_attributes(resource, resource_params) run_build_callbacks resource authorize_resource! resource set_resource_ivar resource end end
Builds, memoize and authorize a new instance of the resource. The actual work of building the new instance is delegated to the build_new_resource
method.
This method is used to instantiate and authorize new resources in the new and create controller actions.
@return [ActiveRecord::Base] An un-saved active record base object
Source
# File lib/active_admin/resource_controller/data_access.rb, line 43 def collection get_collection_ivar || begin collection = find_collection authorize! Authorization::READ, active_admin_config.resource_class set_collection_ivar collection end end
Retrieve, memoize and authorize the current collection from the db. This method delegates the finding of the collection to find_collection
.
Once collection
has been called, the collection is available using either the @collection instance variable or an instance variable named after the resource that the collection is for. eg: Post => @post.
@return [ActiveRecord::Relation] The collection for the index
Source
# File lib/active_admin/resource_controller/data_access.rb, line 262 def collection_applies(options = {}) only = Array(options.fetch(:only, COLLECTION_APPLIES)) except = Array(options.fetch(:except, [])) COLLECTION_APPLIES & only - except end
Source
# File lib/active_admin/resource_controller/data_access.rb, line 240 def collection_before_scope @collection_before_scope end
Source
# File lib/active_admin/resource_controller/data_access.rb, line 291 def configured_per_page Array(active_admin_config.per_page).first end
Source
# File lib/active_admin/resource_controller/data_access.rb, line 143 def create_resource(object) run_create_callbacks object do save_resource(object) end end
Calls all the appropriate callbacks and then creates the new resource.
@param [ActiveRecord::Base] object The new resource to create
@return [void]
Source
# File lib/active_admin/resource_controller/data_access.rb, line 244 def current_scope @current_scope ||= if params[:scope] active_admin_config.get_scope_by_id(params[:scope]) else active_admin_config.default_scope(self) end end
Source
# File lib/active_admin/resource_controller/data_access.rb, line 181 def destroy_resource(object) run_destroy_callbacks object do object.destroy end end
Destroys an object from the database and calls appropriate callbacks.
@return [void]
Source
# File lib/active_admin/resource_controller/data_access.rb, line 287 def dynamic_per_page params[:per_page] || @per_page end
Source
# File lib/active_admin/resource_controller/data_access.rb, line 57 def find_collection(options = {}) collection = scoped_collection collection_applies(options).each do |applyer| collection = send("apply_#{applyer}", collection) end collection end
Does the actual work of retrieving the current collection from the db. This is a great method to override if you would like to perform some additional db # work before your controller returns and authorizes the collection.
@return [ActiveRecord::Relation] The collection for the index
Source
# File lib/active_admin/resource_controller/data_access.rb, line 103 def find_resource scoped_collection.send method_for_find, params[:id] end
Does the actual work of finding a resource in the database. This method uses the finder method as defined in InheritedResources.
@return [ActiveRecord::Base] An active record object.
Source
# File lib/active_admin/resource_controller/data_access.rb, line 269 def in_paginated_batches(&block) ActiveRecord::Base.uncached do (1..paginated_collection.total_pages).each do |page| paginated_collection(page).each do |resource| yield apply_decorator(resource) end end end end
Source
# File lib/active_admin/resource_controller/data_access.rb, line 279 def per_page if active_admin_config.paginate dynamic_per_page || configured_per_page else active_admin_config.max_per_page end end
Source
# File lib/active_admin/resource_controller/data_access.rb, line 89 def resource get_resource_ivar || begin resource = find_resource resource = apply_decorations(resource) authorize_resource! resource set_resource_ivar resource end end
Retrieve, memoize and authorize a resource based on params. The actual work of finding the resource is done in find_resource
.
This method is used on all the member actions:
* show * edit * update * destroy
@return [ActiveRecord::Base] An active record object
Source
# File lib/active_admin/resource_controller/data_access.rb, line 154 def save_resource(object) run_save_callbacks object do object.save end end
Calls all the appropriate callbacks and then saves the new resource.
@param [ActiveRecord::Base] object The new resource to save
@return [void]
Source
# File lib/active_admin/resource_controller/data_access.rb, line 74 def scoped_collection end_of_association_chain end
Override this method in your controllers to modify the start point of our searches and index.
This method should return an ActiveRecord::Relation object so that the searching and filtering can be applied on top
Note, unless you are doing something special, you should use the scope_to method from the Scoping
module instead of overriding this method.
Source
# File lib/active_admin/resource_controller/data_access.rb, line 317 def smart_resource_url if create_another? new_resource_url(create_another: params[:create_another]) else super end end
@return [String]
Source
# File lib/active_admin/resource_controller/data_access.rb, line 170 def update_resource(object, attributes) object = assign_attributes(object, attributes) run_update_callbacks object do save_resource(object) end end
Update an object with the given attributes. Also calls the appropriate callbacks for update action.
@param [ActiveRecord::Base] object The instance to update
@param [Array] attributes An array with the attributes in the first position
and the Active Record "role" in the second. The role may be set to nil.
@return [void]
Private Instance Methods
Source
# File lib/active_admin/resource_controller/data_access.rb, line 343 def batch_size 1000 end
Source
# File lib/active_admin/resource_controller/data_access.rb, line 329 def create_another? params[:create_another].present? end
@return [Boolean] true if user requested to create one more
resource after creating this one.
Source
# File lib/active_admin/resource_controller/data_access.rb, line 337 def paginate(chain, page, per_page) page_method_name = Kaminari.config.page_method_name chain.public_send(page_method_name, page).per(per_page) end
Source
# File lib/active_admin/resource_controller/data_access.rb, line 333 def paginated_collection(page_no = 1) paginate(collection, page_no, batch_size) end