module ActiveScaffold::Actions::Nested

Public Class Methods

included(base) click to toggle source
# File lib/active_scaffold/actions/nested.rb, line 4
def self.included(base)
  super
  base.module_eval do
    before_filter :set_nested
    before_filter :configure_nested
    include ActiveScaffold::Actions::Nested::ChildMethods if active_scaffold_config.model.reflect_on_all_associations.any? { |a| a.macro == :has_and_belongs_to_many }
  end
  base.before_filter :include_habtm_actions
  base.helper_method :nested
  base.helper_method :nested_parent_record
end

Protected Instance Methods

beginning_of_chain() click to toggle source
# File lib/active_scaffold/actions/nested.rb, line 79
def beginning_of_chain
  if nested? && nested.association
    if nested.association.collection?
      nested_parent_record.send(nested.association.name)
    elsif nested.association.options[:through] # has_one :through
      active_scaffold_config.model.where(active_scaffold_config.model.primary_key => nested_parent_record.send(nested.association.name).try(:id))
    elsif nested.child_association.nil? # without child_association is not possible to add conditions
      active_scaffold_config.model
    elsif nested.child_association.belongs_to?
      active_scaffold_config.model.where(nested.child_association.foreign_key => nested_parent_record.send(nested.association.association_primary_key))
    elsif nested.association.belongs_to?
      chain = active_scaffold_config.model.joins(nested.child_association.name)
      table_name =
        if active_scaffold_config.model == nested.association.active_record
          dependency = ActiveRecord::Associations::JoinDependency.new(chain.klass, chain.joins_values, [])
          join_associations = Rails.version >= '4.1.0' ? dependency.join_root.children : dependency.join_associations
          join_associations.find {|join| join.try(:reflection).try(:name) == nested.child_association.name}.try(:table).try(:right)
        end
      table_name ||= nested.association.active_record.table_name
      chain.where(table_name => {nested.association.active_record.primary_key => nested_parent_record}).readonly(false)
    end
  elsif nested? && nested.scope
    nested_parent_record.send(nested.scope)
  else
    active_scaffold_config.model
  end
end
configure_nested() click to toggle source
# File lib/active_scaffold/actions/nested.rb, line 33
def configure_nested
  return unless nested?
  active_scaffold_config.list.user.label = nested_label
  active_scaffold_config.list.user.nested_default_sorting = nested_default_sorting if nested.sorted? && !active_scaffold_config.nested.ignore_order_from_association
end
create_association_with_parent(record) click to toggle source
# File lib/active_scaffold/actions/nested.rb, line 111
def create_association_with_parent(record)
  # has_many is done by beginning_of_chain and rails
  return unless (nested.belongs_to? || nested.has_one? || nested.habtm?) && nested.child_association
  return if (parent = nested_parent_record).nil?
  case nested.child_association.macro
  when :has_one, :belongs_to
    record.send("#{nested.child_association.name}=", parent)
  when :has_many, :has_and_belongs_to_many
    record.send("#{nested.child_association.name}").send(:<<, parent)
  end
end
include_habtm_actions() click to toggle source
# File lib/active_scaffold/actions/nested.rb, line 55
def include_habtm_actions
  return unless nested?
  if nested.habtm?
    # Production mode is ok with adding a link everytime the scaffold is nested - we are not ok with that.
    active_scaffold_config.action_links.add('new_existing', :label => :add_existing, :type => :collection, :security_method => :add_existing_authorized?) unless active_scaffold_config.action_links['new_existing']
    if active_scaffold_config.nested.shallow_delete
      active_scaffold_config.action_links.add('destroy_existing', :label => :remove, :type => :member, :confirm => :are_you_sure_to_delete, :method => :delete, :position => false, :security_method => :delete_existing_authorized?) unless active_scaffold_config.action_links['destroy_existing']
      if active_scaffold_config.actions.include?(:delete)
        active_scaffold_config.action_links.delete('delete') if active_scaffold_config.action_links['delete']
      end
    end
  else
    # Production mode is caching this link into a non nested scaffold
    active_scaffold_config.action_links.delete('new_existing') if active_scaffold_config.action_links['new_existing']

    if active_scaffold_config.nested.shallow_delete
      active_scaffold_config.action_links.delete('destroy_existing') if active_scaffold_config.action_links['destroy_existing']
      if active_scaffold_config.actions.include?(:delete)
        active_scaffold_config.action_links.add(ActiveScaffold::Config::Delete.link) unless active_scaffold_config.action_links['delete']
      end
    end
  end
end
nested() click to toggle source
# File lib/active_scaffold/actions/nested.rb, line 18
def nested
  set_nested unless defined? @nested
  @nested
end
nested?() click to toggle source
# File lib/active_scaffold/actions/nested.rb, line 23
def nested?
  !nested.nil?
end
nested_authorized?(record = nil) click to toggle source
# File lib/active_scaffold/actions/nested.rb, line 51
def nested_authorized?(record = nil)
  true
end
nested_default_sorting() click to toggle source
# File lib/active_scaffold/actions/nested.rb, line 47
def nested_default_sorting
  {:table_name => active_scaffold_config.model.model_name, :default_sorting => nested.default_sorting}
end
nested_label() click to toggle source
# File lib/active_scaffold/actions/nested.rb, line 39
def nested_label
  if nested.belongs_to?
    as_(:nested_of_model, :nested_model => active_scaffold_config.model.model_name.human, :parent_model => ERB::Util.h(nested_parent_record.to_label))
  else
    as_(:nested_for_model, :nested_model => active_scaffold_config.list.label, :parent_model => ERB::Util.h(nested_parent_record.to_label))
  end
end
nested_parent_record(crud = :read) click to toggle source
# File lib/active_scaffold/actions/nested.rb, line 107
def nested_parent_record(crud = :read)
  @nested_parent_record ||= find_if_allowed(nested.parent_id, crud, nested.parent_model)
end
set_nested() click to toggle source
# File lib/active_scaffold/actions/nested.rb, line 27
def set_nested
  return unless params[:parent_scaffold] && (params[:association] || params[:named_scope])
  @nested = ActiveScaffold::DataStructures::NestedInfo.get(active_scaffold_config.model, params)
  register_constraints_with_action_columns(@nested.constrained_fields) unless @nested.nil?
end

Private Instance Methods

nested_formats() click to toggle source
# File lib/active_scaffold/actions/nested.rb, line 125
def nested_formats
  (default_formats + active_scaffold_config.formats + active_scaffold_config.nested.formats).uniq
end