polygallery 0.1.2 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/concerns/polygallery/strong_params.rb +5 -3
  3. data/app/models/concerns/polygallery/acts_as_polyphoto.rb +64 -32
  4. data/app/views/polygallery/galleries/_simple_fields_for.html.haml +5 -4
  5. data/app/views/polygallery/photos/_simple_fields_for.html.haml +2 -1
  6. data/lib/polygallery/has_polygallery.rb +85 -14
  7. data/lib/polygallery/has_polyphotos.rb +46 -55
  8. data/lib/polygallery/railtie.rb +1 -1
  9. data/lib/polygallery/version.rb +1 -1
  10. data/test/dummy/app/controllers/events_controller.rb +2 -1
  11. data/test/dummy/app/controllers/home_controller.rb +1 -0
  12. data/test/dummy/app/models/event.rb +1 -5
  13. data/test/dummy/app/views/events/_simple_form.html.haml +1 -1
  14. data/test/dummy/log/development.log +4002 -0
  15. data/test/dummy/log/test.log +11639 -0
  16. data/test/dummy/public/system/polygallery/photos/photos/000/000/001/medium/logo_placeholder_medium.png +0 -0
  17. data/test/dummy/public/system/polygallery/photos/photos/000/000/001/original/logo_placeholder_medium.png +0 -0
  18. data/test/dummy/public/system/polygallery/photos/photos/000/000/001/thumb/logo_placeholder_medium.png +0 -0
  19. data/test/dummy/public/system/polygallery/photos/photos/000/000/002/medium/logo_placeholder_medium.png +0 -0
  20. data/test/dummy/public/system/polygallery/photos/photos/000/000/002/thumb/logo_placeholder_medium.png +0 -0
  21. data/test/dummy/public/system/polygallery/photos/photos/000/000/003/medium/logo_placeholder_medium.png +0 -0
  22. data/test/dummy/public/system/polygallery/photos/photos/000/000/003/thumb/logo_placeholder_medium.png +0 -0
  23. data/test/dummy/public/system/polygallery/photos/photos/000/000/004/medium/logo_placeholder_medium.png +0 -0
  24. data/test/dummy/public/system/polygallery/photos/photos/000/000/004/thumb/logo_placeholder_medium.png +0 -0
  25. data/test/dummy/public/system/polygallery/photos/photos/000/000/005/medium/logo_placeholder_medium.png +0 -0
  26. data/test/dummy/public/system/polygallery/photos/photos/000/000/005/original/logo_placeholder_medium.png +0 -0
  27. data/test/dummy/public/system/polygallery/photos/photos/000/000/005/thumb/logo_placeholder_medium.png +0 -0
  28. data/test/dummy/public/system/polygallery/photos/photos/000/000/006/custom/logo_placeholder_medium.png +0 -0
  29. data/test/dummy/public/system/polygallery/photos/photos/000/000/006/medium/logo_placeholder_medium.png +0 -0
  30. data/test/dummy/public/system/polygallery/photos/photos/000/000/006/original/logo_placeholder_medium.png +0 -0
  31. data/test/dummy/public/system/polygallery/photos/photos/000/000/006/thumb/logo_placeholder_medium.png +0 -0
  32. data/test/dummy/public/system/polygallery/photos/photos/000/000/007/medium/logo_placeholder_medium.png +0 -0
  33. data/test/dummy/public/system/polygallery/photos/photos/000/000/007/original/logo_placeholder_medium.png +0 -0
  34. data/test/dummy/public/system/polygallery/photos/photos/000/000/007/thumb/logo_placeholder_medium.png +0 -0
  35. data/test/dummy/public/system/polygallery/photos/photos/000/000/008/medium/logo_placeholder_medium.png +0 -0
  36. data/test/dummy/public/system/polygallery/photos/photos/000/000/008/original/logo_placeholder_medium.png +0 -0
  37. data/test/dummy/public/system/polygallery/photos/photos/000/000/008/thumb/logo_placeholder_medium.png +0 -0
  38. data/test/dummy/public/system/polygallery/photos/photos/000/000/011/custom/logo_placeholder_medium.png +0 -0
  39. data/test/dummy/public/system/polygallery/photos/photos/000/000/011/medium/logo_placeholder_medium.png +0 -0
  40. data/test/dummy/public/system/polygallery/photos/photos/000/000/011/original/logo_placeholder_medium.png +0 -0
  41. data/test/dummy/public/system/polygallery/photos/photos/000/000/011/thumb/logo_placeholder_medium.png +0 -0
  42. data/test/dummy/public/system/polygallery/photos/photos/000/000/014/custom/logo_placeholder_medium.png +0 -0
  43. data/test/dummy/public/system/polygallery/photos/photos/000/000/014/medium/logo_placeholder_medium.png +0 -0
  44. data/test/dummy/public/system/polygallery/photos/photos/000/000/014/original/logo_placeholder_medium.png +0 -0
  45. data/test/dummy/public/system/polygallery/photos/photos/000/000/014/thumb/logo_placeholder_medium.png +0 -0
  46. data/test/dummy/spec/features/events_spec.rb +54 -7
  47. metadata +50 -4
  48. data/test/dummy/tmp/pids/server.pid +0 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: fa9f9f989f87f7a55dd5a9174add48b1947727ae
4
- data.tar.gz: 52d22be3a15e569dc030f43b7bb31cc59b07f094
3
+ metadata.gz: 748c58237c3287c39ed71c22b4d610f9930d16fe
4
+ data.tar.gz: 4679777b8785fb32c0e997c6083c441dffa80ba9
5
5
  SHA512:
6
- metadata.gz: 3bda03dccc7bbc3cc2e53b1db97e539e6b886886299bb1472b79e85ebe8469b57b5f7007c5a0cd6e98414da14f4e0ca9a13aa74dda482ee7572bbf725695bcbe
7
- data.tar.gz: 780269277ba55672bb7602c42dfa0d83e8f68f543f98aee61e68c152f2c24055053d437d89b871a55a1041120d74ae8c2840a472c4e6712fdc88bb2ed91566e1
6
+ metadata.gz: 778e7320a67042cd19d166f52c824002790aa3141061609069af9d1f2970993d3cef86623640a1b611a98df0f6b67b7019e65f652742afb4db525c8a0e138cb1
7
+ data.tar.gz: c2d0c55787f5f5e3f2a60f83b28ab953d16e093cf89f743361f2e1da3074a6219c965e8d2e0c426b073877e06a3e2cb1d1ab546cfbbe106dfbccc6e08a667b39
@@ -4,7 +4,9 @@ module Polygallery::StrongParams
4
4
  included do
5
5
  end
6
6
 
7
- def polygallery_params
8
- [:id, :title, :_destroy, {:photos_attributes => [:id, :photo, :title, :caption, :_destroy]}]
7
+ def polygallery_params(association='photos')
8
+ [:id, :title, :_destroy, {:"#{association}_attributes" =>
9
+ [:id, :photo, :title, :caption,
10
+ :gallery_title, :_destroy]}]
9
11
  end
10
- end
12
+ end
@@ -2,47 +2,79 @@ module Polygallery
2
2
  module ActsAsPolyphoto
3
3
  extend ActiveSupport::Concern
4
4
 
5
- DEFAULTS = {
6
- :paperclip => {
7
- :styles => {:medium => '300x300#', :thumb => '100x100#'},
8
- :default_url => '/images/:style/missing.png'
9
- }
10
- }
11
-
12
5
  included do
13
- attr_accessor :photo_to_upload,
6
+ attr_accessor :photo_to_upload, :polygallery_options,
14
7
  :galleryable_id, :galleryable_type, :gallery_title
15
-
16
- # has_attached_file :photo,
17
- # :styles => PAPERCLIP_SETTINGS[:styles], # ->(a) { if a.instance.class.name then raise a.instance.class.name else PAPERCLIP_SETTINGS[:styles] end },
18
- # :default_url => PAPERCLIP_SETTINGS[:default_url]
19
- # validates_attachment_content_type :photo, :content_type => /\Aimage\/.*\Z/
20
- # validates_attachment_presence :photo # TODO: make this a setting
21
-
22
- belongs_to :gallery, :class_name => 'Polygallery::Gallery'
23
-
24
- after_initialize :init_attachment
25
- before_save :process_photo_to_upload
8
+ acts_as_polyphoto
26
9
  end
27
10
 
28
11
  module ClassMethods
29
- end
12
+ def acts_as_polyphoto(options={})
13
+ defaults = self.polygallery_settings
14
+ settings = defaults.deep_merge(options)
15
+
16
+ after_initialize do
17
+ @polygallery_settings = settings if settings == HasPolygallery::DEFAULTS
18
+ self.initialize_polyphoto
19
+ end
30
20
 
31
- def paperclip_settings
32
- return self.gallery.polygallery_settings[:paperclip] if self.gallery.present?
33
- DEFAULTS[:paperclip]
34
- end
21
+ include ActsAsPolyphoto::LocalInstanceMethods
22
+ end
35
23
 
36
- def process_photo_to_upload
37
- self.photo = File.open(photo_to_upload) if photo_to_upload.present?
24
+ def polygallery_settings
25
+ @polygallery_settings || HasPolygallery::DEFAULTS
26
+ end
38
27
  end
39
28
 
40
- def init_attachment
41
- self.class.has_attached_file :photo,
42
- :styles => paperclip_settings[:styles],
43
- :default_url => paperclip_settings[:default_url]
44
- self.class.validates_attachment_content_type :photo, :content_type => /\Aimage\/.*\Z/
45
- # self.class.validates_attachment_presence :photo # TODO: make this a setting
29
+ module LocalInstanceMethods
30
+ def include_polygallery_settings(settings)
31
+ @polygallery_settings = settings
32
+ self.initialize_polyphoto
33
+ end
34
+
35
+ def initialize_polyphoto
36
+ settings = self.polygallery_settings
37
+
38
+ self.class.belongs_to settings[:association_names][:gallery],
39
+ :class_name => settings[:associations][:gallery][:class_name],
40
+ :foreign_key => :gallery_id
41
+
42
+ self.init_attachment
43
+ self.class.before_save :process_photo_to_upload
44
+ end
45
+
46
+ def polygallery_settings
47
+ polygallery_options || @polygallery_settings || HasPolygallery::DEFAULTS
48
+ # if gallery_title.present? && galleryable_type.present?
49
+ # galleryable_class = Kernel.const_get(galleryable_type)
50
+ # galleryable_class.send :"#{gallery_title}_settings"
51
+ # elsif gallery_title.present?
52
+ # self.send(gallery_title.to_sym).polygallery_settings
53
+ # elsif self.gallery.present? && gallery.polygallery_settings.present?
54
+ # self.gallery.polygallery_settings
55
+ # else
56
+ # HasPolygallery::DEFAULTS
57
+ # end
58
+ end
59
+
60
+ def paperclip_settings
61
+ self.polygallery_settings[:paperclip]
62
+ end
63
+
64
+ def process_photo_to_upload
65
+ self.photo = File.open(photo_to_upload) if photo_to_upload.present?
66
+ end
67
+
68
+ def init_attachment
69
+ self.class.has_attached_file :photo,
70
+ :styles => paperclip_settings[:styles],
71
+ :default_url => paperclip_settings[:default_url]
72
+ validations = polygallery_settings[:paperclip_validations]
73
+ self.class.validates_attachment_content_type(:photo, :content_type =>
74
+ validations[:content_type]) if validations[:content_type]
75
+ self.class.validates_attachment_presence(:photo) if validations[:presence]
76
+ end
77
+
46
78
  end
47
79
  end
48
80
  end
@@ -1,14 +1,15 @@
1
+ - photo_association_name = gallery.polygallery_settings[:association_names][:photos]
1
2
  = f.simple_fields_for gallery.title.to_sym do |ff|
2
3
  = ff.input_field :title, :as => :hidden, :value => gallery.title
3
4
 
4
5
  - if options[:label]
5
6
  %h3.lead
6
- = link_to_add_association 'Add Photo', ff, gallery.class.polygallery_settings[:association_names][:photos], :partial => 'polygallery/photos/simple_fields_for', :class => 'btn btn-default btn-sm pull-right', :data => {:association_insertion_node => '.photo-receptacle', :association_insertion_method => 'append'}
7
+ = link_to_add_association 'Add Photo', ff, photo_association_name, :partial => 'polygallery/photos/simple_fields_for', :class => 'btn btn-default btn-sm pull-right', :data => {:association_insertion_node => "##{photo_association_name} .photo-receptacle", :association_insertion_method => 'append'}
7
8
  - if options[:label] == true
8
9
  = gallery.title.titleize
9
10
  - else
10
11
  = options[:label].titleize
11
- .polygallery-cocoon-table{:id => gallery.class.polygallery_settings[:association_names][:photos].to_s}
12
+ .polygallery-cocoon-table{:id => photo_association_name.to_s}
12
13
  %table.table.table-bordered.table-striped.table-condensed.polygallery-photos-table
13
14
  %thead
14
15
  %tr
@@ -16,8 +17,8 @@
16
17
  %th File
17
18
  %th.text-center Actions
18
19
  %tbody.photo-receptacle
19
- = ff.simple_fields_for :photos do |pf|
20
- = render :partial => 'polygallery/photos/simple_fields_for', :locals => {:f => pf}
20
+ = ff.simple_fields_for photo_association_name do |pf|
21
+ = render 'polygallery/photos/simple_fields_for', :f => pf
21
22
 
22
23
  -#- if !options[:label]
23
24
  -# = ff.input_field :content, options[:input_html].merge({:as => :ckeditor})
@@ -1,9 +1,10 @@
1
1
  %tr.nested-fields{:data => {:new => f.object.new_record?}}
2
2
  %td.text-center
3
+ -# = f.input_field :gallery_title
3
4
  = image_tag f.object.photo.file? ? f.object.photo.url(:thumb) : 'polygallery/thumbnail-missing.jpg', :class => 'img-responsive' # image_path('polygallery/thumbnail-missing.jpg')
4
5
  %td
5
6
  = f.input_field :photo
6
7
  = f.input_field :caption, :placeholder => "Caption... (optional)", :style => "margin-top:5px;", :as => :string
7
8
  %td.text-center{:style => "width:51px;"}
8
9
  = link_to_remove_association f, :class => 'btn btn-default btn-sm' do
9
- %span.glyphicon.glyphicon-trash
10
+ %span.glyphicon.glyphicon-trash
@@ -2,8 +2,51 @@ module Polygallery
2
2
  module HasPolygallery
3
3
  extend ActiveSupport::Concern
4
4
 
5
- included do
5
+ DEFAULTS = {
6
+ :associations => {
7
+ :gallery => {
8
+ :class_name => '::Polygallery::Gallery',
9
+ :as => :galleryable,
10
+ :dependent => :destroy
11
+ },
12
+ :photos => {
13
+ :class_name => '::Polygallery::Photo',
14
+ :before_add => :set_nest,
15
+ :dependent => :destroy,
16
+ :foreign_key => :gallery_id
17
+ }
18
+ },
19
+ :association_names => {
20
+ :gallery => :gallery,
21
+ :photos => :photos
22
+ },
23
+ :nested_attributes => {
24
+ :gallery => {
25
+ :reject_if => :all_blank
26
+ # proc {|attributes| false }
27
+ # photo_attr_sets = attributes
28
+ # .select{|k, _| k.include? 'photos_attributes' }
29
+ # photo_attr_sets.select{|_, photo_sets|
30
+ # photo_sets.select{|_, photo_attrs|
31
+ # puts photo_attrs
32
+ # photo_attrs.key? 'photo' }.empty? }.empty? }
33
+ },
34
+ :photos => {
35
+ :reject_if => proc {|attributes| !attributes.key?('photo') },
36
+ :allow_destroy => true}
37
+ },
38
+ :validates => {},
39
+ :paperclip => {
40
+ :styles => {:medium => '300x300#', :thumb => '100x100#'},
41
+ :default_url => ActionController::Base.helpers.image_path('polygallery/thumbnail-missing.png')
42
+ },
43
+ :paperclip_validations => {
44
+ :content_type => /\Aimage\/.*\Z/,
45
+ :presence => false
46
+ }
47
+ }
6
48
 
49
+ included do
7
50
  end
8
51
 
9
52
  module ClassMethods
@@ -17,49 +60,77 @@ module Polygallery
17
60
  gallery_association = options[:associations][:gallery] if associations.present?
18
61
  gallery_class_name = gallery_association[:class_name] if gallery_association.present?
19
62
  defaults = if gallery_class_name.present? && gallery_class_name != 'Polygallery::Gallery'
20
- Kernel.const_get(gallery_class_name)::DEFAULTS
63
+ Kernel.const_get(gallery_class_name)::POLYGALLERY_DEFAULTS
21
64
  else
22
- Gallery::DEFAULTS
65
+ HasPolygallery::DEFAULTS
23
66
  end
67
+ if options[:association_names].nil? && title.to_s != 'gallery'
68
+ options[:association_names] = {
69
+ :gallery => title.to_sym,
70
+ :photos => :"#{title.to_s.gsub('_gallery', '')}_photos"
71
+ }
72
+ end
24
73
  settings = defaults.deep_merge(options)
25
74
  cattr_accessor "#{title}_settings".to_sym
26
75
  send("#{title}_settings=".to_sym, settings)
27
76
 
28
77
  has_one title.to_sym, -> { where(:title => title.to_s) }, settings[:associations][:gallery]
29
- accepts_nested_attributes_for title.to_sym, settings[:nested_attributes][:gallery]
30
- has_many "#{title}_photos".to_sym,
31
- :through => title.to_sym,
78
+ has_many settings[:association_names][:photos],
79
+ :through => :"#{title}",
32
80
  :source => settings[:association_names][:photos],
33
81
  :class_name => settings[:associations][:photos][:class_name]
82
+ accepts_nested_attributes_for settings[:association_names][:gallery],
83
+ settings[:nested_attributes][:gallery]
84
+ accepts_nested_attributes_for settings[:association_names][:photos],
85
+ settings[:nested_attributes][:photos]
86
+
87
+ after_initialize :build_galleries
34
88
 
35
- after_initialize do
36
- send("build_#{title.to_s}".to_sym) if send(title.to_sym).nil?
37
- send(title.to_sym).send(:galleryable=, self)
38
- end
39
89
  include HasPolygallery::LocalInstanceMethods
40
90
  end
41
91
 
42
92
  def polygalleries
43
- self.reflect_on_all_associations(:has_one).select{|a| a.foreign_key == 'galleryable_id'}.map(&:name)
93
+ self.reflect_on_all_associations(:has_one)
94
+ .select{|a| a.foreign_key == 'galleryable_id'}.map(&:name)
44
95
  end
45
96
 
46
- def has_polygallery?(title)
47
- self.polygalleries.include?(title)
97
+ def has_polygallery?(title=nil)
98
+ return polygalleries.any? if title.nil?
99
+ polygalleries.include?(title)
48
100
  end
49
101
  end
50
102
 
51
103
  module LocalInstanceMethods
52
104
  def polygalleries
105
+ # TODO: use association reflections instead of direct class selection
53
106
  Gallery.select('polygallery_galleries.title')
54
107
  .where(:galleryable => self)
55
108
  .group('polygallery_galleries.title')
56
109
  .map(&:title)
57
110
  end
58
111
 
59
- def has_polygallery?(title)
112
+ def has_polygallery?(title=nil)
113
+ return polygalleries.any? if title.nil?
60
114
  polygalleries.include?(title)
61
115
  end
62
116
 
117
+ def build_galleries
118
+ return unless self.class.has_polygallery?
119
+ self.class.polygalleries.each do |pg|
120
+ gallery_association = send pg
121
+ next if gallery_association.present?
122
+ gallery_settings = send :"#{pg.to_s}_settings"
123
+ gallery_association ||= send :"build_#{pg.to_s}",
124
+ :polygallery_options => gallery_settings
125
+ gallery_association.galleryable ||= self
126
+ end
127
+ end
128
+
129
+ def build_first_photos
130
+ build_galleries(&:build_first_photo)
131
+ return unless self.class.has_polygallery?
132
+ self.class.polygalleries.each {|pg| send(pg).build_first_photo }
133
+ end
63
134
  end
64
135
  end
65
136
  end
@@ -1,87 +1,78 @@
1
1
  module Polygallery
2
2
  module HasPolyphotos
3
3
  extend ActiveSupport::Concern
4
-
5
- DEFAULTS = {
6
- :associations => {
7
- :gallery => {
8
- :class_name => 'Polygallery::Gallery',
9
- :as => :galleryable,
10
- :dependent => :destroy
11
- },
12
- :photos => {
13
- :class_name => 'Polygallery::Photo',
14
- :before_add => :set_nest,
15
- :dependent => :destroy
16
- }
17
- },
18
- :association_names => {
19
- :gallery => :gallery,
20
- :photos => :photos
21
- },
22
- :nested_attributes => {
23
- :gallery => {:reject_if => :all_blank},
24
- :photos => {:reject_if => lambda{|attributes| attributes['photo'].nil? }, :allow_destroy => true}
25
- },
26
- :validates => {},
27
- :paperclip => {
28
- :styles => {:medium => '300x300#', :thumb => '100x100#'},
29
- :default_url => ActionController::Base.helpers.asset_path('polygallery/thumbnail-missing.png')
30
- }
31
- }
32
4
 
33
5
  included do
34
- # def defaults
35
- # klass = self.class_name.present? ? Kernel.const_get(self.class_name) : Gallery
36
- # klass::DEFAULTS
37
- # end
6
+ attr_accessor :polygallery_options
38
7
  end
39
8
 
40
9
  module ClassMethods
41
- def has_polyphotos(title='photos', options={})
10
+ def has_polyphotos(title=nil, options={})
11
+ defaults = self.polygallery_settings
12
+ association_names = (options[:association_names].present? ?
13
+ options : defaults)[:association_names]
14
+ title ||= association_names[:photos].to_s
42
15
  if title.is_a? Hash
43
16
  options = title
44
- title = 'photos'
17
+ title = association_names[:photos].to_s
45
18
  end
46
19
 
47
- # puts reflect_on_all_associations(:belongs_to).map{|a| a.table_name }
48
- settings = HasPolyphotos::DEFAULTS.deep_merge(options)
49
- cattr_accessor :polygallery_settings
50
- send(:polygallery_settings=, settings)
51
- puts HasPolyphotos::DEFAULTS
52
- has_many title.to_sym, settings[:associations][:photos]
53
- accepts_nested_attributes_for title.to_sym, settings[:nested_attributes][:photos] # TODO: get the actual @settings somehow
20
+ settings = defaults.deep_merge options
21
+
54
22
  after_initialize do
55
- # raise galleryable_type if galleryable_type.present?
56
- send(title.to_sym).build(
57
- :galleryable_id => galleryable_id,
58
- :galleryable_type => galleryable_type,
59
- :"#{settings[:association_names][:gallery]}_title" => self.title
60
- ) unless send(title.to_sym).any?
23
+ @polygallery_settings = settings if settings == HasPolygallery::DEFAULTS
24
+ self.initialize_polygallery
61
25
  end
62
- after_initialize :do_something
26
+
63
27
  include HasPolyphotos::LocalInstanceMethods
64
28
  end
65
29
 
66
- # def polygallery_settings
67
- # @settings
68
- # end
30
+ def polygallery_settings
31
+ @polygallery_settings || HasPolygallery::DEFAULTS
32
+ end
69
33
  end
70
34
 
71
35
 
72
36
  module LocalInstanceMethods
73
37
  def set_nest(photo)
74
- photo.gallery ||= self
38
+ photo.send(:"#{title}=", self) if photo.send(:"#{title}").nil?
75
39
  photo.galleryable_id ||= galleryable_id
76
40
  photo.galleryable_type ||= galleryable_type
77
41
  photo.gallery_title ||= title
78
42
  end
79
43
 
80
- def do_something
81
- @polygallery_settings = Kernel.const_get(self.galleryable_type)
82
- .send :"#{self.title}_settings"
44
+ # def polygallery_settings
45
+ # Kernel.const_get(self.galleryable_type).send :"#{self.title}_settings"
46
+ # end
47
+
48
+ def include_polygallery_settings(settings)
49
+ @polygallery_settings = settings
50
+ self.initialize_polygallery
51
+ end
52
+
53
+ def initialize_polygallery
54
+ settings = self.polygallery_settings
55
+ association_names = settings[:association_names]
56
+ self.class.has_many association_names[:photos],
57
+ settings[:associations][:photos].deep_merge({})
58
+ self.class.accepts_nested_attributes_for association_names[:photos],
59
+ settings[:nested_attributes][:photos]
83
60
  end
84
61
 
62
+ def build_first_photo
63
+ settings = polygallery_settings
64
+ photo_association = send settings[:association_names][:photos]
65
+ photo_association.build(
66
+ :polygallery_options => settings,
67
+ :galleryable_id => galleryable_id,
68
+ :galleryable_type => galleryable_type,
69
+ :gallery_title => self.title
70
+ ) unless photo_association.any?
71
+ end
72
+
73
+ def polygallery_settings
74
+ polygallery_options || @polygallery_settings || HasPolygallery::DEFAULTS
75
+ end
85
76
  end
86
77
  end
87
78
  end