lib/mls.rb in mls-1.4.3 vs lib/mls.rb in mls-1.5.0

- old
+ new

@@ -46,25 +46,101 @@ module MLS::Slugger extend ActiveSupport::Concern - module ClassMethods + included do + class_attribute :slugger + send :include, MLS::Slugger::ActiveRecordBaseSluggerExtension + relation.class.send :include, MLS::Slugger::ActiveRecordRelationSluggerExtension + end - def find(*ids) - friendly = -> (id) { id.respond_to?(:to_i) && id.to_i.to_s != id.to_s } - return super if ids.size > 1 || !ids.all? { |x| friendly.call(x) } + module ActiveRecordBaseSluggerExtension + extend ActiveSupport::Concern - find_by_slug!(ids) + # TODO: Test + def to_param + slug? ? slug : super end - end + def set_slug + generated_slug = if self.slugger[:proc].is_a?(Proc) + if (self.slugger[:proc].arity == 1) + self.slugger[:proc].call(self) + else + self.slugger[:proc].call + end + else + send(self.slugger[:proc]) + end + generated_slug = generated_slug ? generated_slug.split('/').map(&:parameterize).join('/') : nil - def to_param - slug + if self.slugger[:options][:history] + self.slugger[:slug_was] = self.slug + end + + if [:before_validation, :after_validation, :before_save, :before_create].include?(self.slugger[:options][:trigger]) + self.slug = generated_slug + else + update_column(:slug, generated_slug) if slug != generated_slug + end + end + + module ClassMethods + + def slug(method, options={}, &block) + options = options.with_indifferent_access + options[:trigger] ||= :after_save + self.slugger = { :proc => method || block, :options => options } + self.send(options[:trigger], :set_slug) + self.send(:include, Slugger::History) if options[:history] + end + + def find(*ids) + friendly = -> (id) { id.respond_to?(:to_i) && id.to_i.to_s != id.to_s } + return super if ids.size > 1 || !ids.all? { |x| friendly.call(x) } + + find_by_slug!(ids.first) + end + + end + end + module ActiveRecordRelationSluggerExtension + + def find_one(id) + friendly = id.respond_to?(:to_i) && id.to_i.to_s != id.to_s + friendly ? find_by_slug!(id) : super + end + + def find_some(ids) + friendly = -> (id) { id.respond_to?(:to_i) && id.to_i.to_s != id.to_s } + return super if !ids.all? { |x| friendly.call(x) } + + result = where(table['slug'].in(ids)).to_a + + expected_size = + if limit_value && ids.size > limit_value + limit_value + else + ids.size + end + + # 11 ids with limit 3, offset 9 should give 2 results. + if offset_value && (ids.size - offset_value < expected_size) + expected_size = ids.size - offset_value + end + + if result.size == expected_size + result + else + raise_record_not_found_exception!(ids, result.size, expected_size) + end + end + + end end module MLS::Avatar extend ActiveSupport::Concern @@ -72,9 +148,10 @@ included do belongs_to :avatar, :class_name => 'Image' end def avatar_url(options={}) + return nil unless avatar_hash_key options.reverse_merge!({ :style => nil, :bg => nil, :protocol => 'https',