throughcheckboxes 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -5,19 +5,35 @@ module ThroughCheckboxes
5
5
  extend ActiveSupport::Concern
6
6
 
7
7
  module ClassMethods
8
- def checkboxes_for(*args)
9
- for relation in args
8
+
9
+ def checkboxes_for(*relations)
10
+
11
+ klass = self
12
+
13
+ ThroughCheckboxes::Core.validate(klass, *relations)
14
+
15
+ for relation in relations
16
+
17
+ field_name="#{relation}_ids"
18
+
19
+ class_eval do
20
+ attr_accessible field_name.to_sym
21
+ end
22
+
10
23
  instance_eval do
11
- define_method "#{relation}_ids=" do |ids|
12
- self.send("#{relation}=",ids.select {|id| id.present?}.map {|id| relation.to_s.classify.constantize.find(id)})
24
+ define_method "#{field_name}=" do |ids|
25
+ send("#{relation}=",ids.select { |id| id.present? }.map {|id| ThroughCheckboxes::Core.relation_klass(klass, relation).find(id)})
13
26
  end
14
27
 
15
- define_method "#{relation}_ids" do
16
- self.send("#{relation}").map {|e| e.id}
28
+ define_method field_name do
29
+ send("#{relation}").map {|e| e.id}
17
30
  end
18
31
  end
32
+
19
33
  end
34
+
20
35
  end
36
+
21
37
  end
22
38
 
23
39
  module InstanceMethods
@@ -7,7 +7,7 @@ module ThroughCheckboxes
7
7
  def checkboxes_for(relation)
8
8
  output = ""
9
9
  output << "#{self.label(relation)}<br />"
10
- for record in relation.to_s.classify.constantize.all
10
+ for record in ThroughCheckboxes::Core.relation_klass(self.object.class, relation).all
11
11
  output << @template.check_box_tag("#{@object_name}[#{relation}_ids][]",record.id,self.object.send(relation).include?(record))
12
12
  output << "#{record}<br />"
13
13
  end
@@ -0,0 +1,26 @@
1
+ module ThroughCheckboxes
2
+
3
+ module Core
4
+
5
+ class ThroughCheckboxesNameError < StandardError; end
6
+
7
+ def self.validate(klass, *relations)
8
+ for relation in relations
9
+ unless (klass.reflections[relation].present? &&
10
+ klass.reflections[relation].macro == :has_many &&
11
+ klass.reflections[relation].options[:through].present?)
12
+ raise ThroughCheckboxesNameError, "#{relation} isn't an has_many :through for model #{klass}, check it out please."
13
+ end
14
+ end
15
+ end
16
+
17
+ def self.relation_klass(klass, relation)
18
+ source=klass.reflections[relation].options[:source]
19
+ relation_klass = source.present? ? source.to_s : relation.to_s
20
+ relation_klass.classify.constantize
21
+ end
22
+
23
+
24
+ end
25
+
26
+ end
@@ -1,3 +1,3 @@
1
1
  module Throughcheckboxes
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
@@ -1,3 +1,4 @@
1
+ require 'throughcheckboxes/core'
1
2
  require 'throughcheckboxes/checkboxes_for'
2
3
  require 'throughcheckboxes/checkboxes_for_helpers'
3
4
 
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 0
8
- - 2
9
- version: 0.0.2
8
+ - 3
9
+ version: 0.0.3
10
10
  platform: ruby
11
11
  authors:
12
12
  - lucapette
@@ -35,6 +35,7 @@ files:
35
35
  - lib/throughcheckboxes.rb
36
36
  - lib/throughcheckboxes/checkboxes_for.rb
37
37
  - lib/throughcheckboxes/checkboxes_for_helpers.rb
38
+ - lib/throughcheckboxes/core.rb
38
39
  - lib/throughcheckboxes/version.rb
39
40
  - throughcheckboxes.gemspec
40
41
  has_rdoc: true