Module: ActionController::Macros::ManyToMany::ClassMethods

Defined in:
lib/smklib/htmlutils.rb

Overview

Example:

# Controller
class BusinessesController < ApplicationController
  many_to_many_for :business, :subcategories, :label => _('Subcategory'), :m2m_field_options => {:item_name => 'name_with_category'}
end

# View
xml.div(:id => 'm2m_business_subcategories') do
  many_to_many_field(xml, 'business', 'subcategories', _('Subcategory'), @subcategories, :item_name => 'name_with_category')
end

Instance Method Summary collapse

Instance Method Details

#many_to_many_for(object, attribute, options = {}) ⇒ Object



557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
# File 'lib/smklib/htmlutils.rb', line 557

def many_to_many_for(object, attribute, options = {})
	#include SMKLib::HtmlUtils
	options = {:max_size => 10, :label => attribute.to_s.capitalize}.merge(options)
	parent_model, child_model = object.to_s.camelize.constantize, attribute.to_s.singularize.camelize.constantize
	@controller = self

	define_method("add_#{attribute.to_s.singularize}_to_#{object}") do
		instance_variable_set("@#{object}", parent_model.find(params[:business_id]))
		collection = instance_variable_get("@#{object}").send(attribute.to_s)
		if collection.size >= options[:max_size]
			flash[:alert] = _("Can't add. This %s already has %d %s.") % [object, options[:max_size], attribute]
		else
			if params[:subcategory_id].to_i > 0
				collection << child_model.find(params[:subcategory_id]) rescue flash[:alert] = _('%s already linked to this %s.') % [attribute.to_s.capitalize.singularize, object]
			else
				c = Category.find_or_create_by_name(params[:categories])
				collection << child_model.find_or_create_by_name_and_category_id(params[:subcategory_id], c[:id])
			end
		end
		redirect_to :action => 'edit', :id => instance_variable_get("@#{object}")[:id]
		# many_to_many_field(nil, object, attribute, options[:label], child_model.find_all, options[:m2m_field_options].merge(:controller => self))
	end

	define_method("remove_#{attribute.to_s.singularize}_from_#{object}") do
		instance_variable_set("@#{object}", parent_model.find(params[:business_id]))
		instance_variable_get("@#{object}").send(attribute).delete(child_model.find(params[:subcategory_id]))
		redirect_to :action => 'edit', :id => instance_variable_get("@#{object}")[:id]
		#raise many_to_many_field(nil, object, attribute, options[:label], child_model.find_all, options[:m2m_field_options].merge(:controller => self))
	end
end