Module: Stringex::ActsAsUrl::ClassMethods
- Defined in:
- lib/stringex/acts_as_url.rb
Overview
:doc:
Instance Method Summary collapse
-
#acts_as_url(attribute, options = {}) ⇒ Object
Creates a callback to automatically create an url-friendly representation of the
attribute
argument. -
#initialize_urls ⇒ Object
Initialize the url fields for the records that need it.
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, = {}) 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 [: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 = [:scope] self.url_attribute = [:url_attribute] || "url" self.only_when_blank = [:only_when_blank] || false self.duplicate_count_separator = [:duplicate_count_separator] || "-" self.allow_slash = [:allow_slash] || false self.allow_duplicates = [:allow_duplicates] || false self.url_limit = [: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_urls ⇒ Object
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 |