Module: Stringex::ActsAsUrl::ClassMethods

Defined in:
lib/stringex/acts_as_url.rb

Overview

:doc:

Instance Method Summary collapse

Instance Method Details

#acts_as_url(attribute, options = {}) ⇒ Object

Creates a callback to automatically create an url-friendly representation of the attribute argument. Example:

act_as_url :title

will use the string contents of the title attribute to create the permalink. <strong>Note:</strong> you can also use a non-database-backed method to supply the string contents for the permalink. Just use that method’s name as the argument as you would an attribute.

The default attribute acts_as_url uses to save the permalink is url but this can be changed in the options hash. Available options are:

:url_attribute

The name of the attribute to use for storing the generated url string. Default is :url

:scope

The name of model attribute to scope unique urls to. There is no default here.

:only_when_blank

If true, the url generation will only happen when :url_attribute is blank. Default is false (meaning url generation will happen always)

:sync_url

If set to true, the url field will be updated when changes are made to the attribute it is based on. Default is false.



29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/stringex/acts_as_url.rb', line 29

def acts_as_url(attribute, options = {})
  cattr_accessor :attribute_to_urlify
  cattr_accessor :scope_for_url
  cattr_accessor :url_attribute # The attribute on the DB
  cattr_accessor :only_when_blank
  cattr_accessor :duplicate_count_separator
  cattr_accessor :allow_slash
  cattr_accessor :allow_duplicates
  cattr_accessor :url_limit

  if options[:sync_url]
    before_validation(:ensure_unique_url)
  else
    if defined?(ActiveModel::Callbacks)
      before_validation(:ensure_unique_url, :on => :create)
    else
      before_validation_on_create(:ensure_unique_url)
    end
  end

  self.attribute_to_urlify = attribute
  self.scope_for_url = options[:scope]
  self.url_attribute = options[:url_attribute] || "url"
  self.only_when_blank = options[:only_when_blank] || false
  self.duplicate_count_separator = options[:duplicate_count_separator] || "-"
  self.allow_slash = options[:allow_slash] || false
  self.allow_duplicates = options[:allow_duplicates] || false
  self.url_limit = options[:limit] || nil

  class_eval <<-"END"
    def #{url_attribute}
      if !new_record? && errors[attribute_to_urlify].present?
        self.class.find(id).send(url_attribute)
      else
        read_attribute(url_attribute)
      end
    end
  END
end

#initialize_urlsObject

Initialize the url fields for the records that need it. Designed for people who add acts_as_url support once there’s already development/production data they’d like to keep around.

Note: This method can get very expensive, very fast. If you’re planning on using this on a large selection, you will get much better results writing your own version with using pagination.



76
77
78
79
80
81
# File 'lib/stringex/acts_as_url.rb', line 76

def initialize_urls
  find(:all, :conditions => {self.url_attribute => nil}).each do |instance|
    instance.send :ensure_unique_url
    instance.save
  end
end