Class: RailsConnector::BasicObj

Inherits:
Object
  • Object
show all
Extended by:
ActiveModel::Naming
Defined in:
lib/rails_connector/basic_obj.rb

Overview

The CMS file class

Class Method Summary collapse

Instance Method Summary collapse

Dynamic Method Handling

This class handles dynamic methods through the method_missing method in the class RailsConnector::AttributeContent

Class Method Details

.allObjSearchEnumerator

Returns a ObjSearchEnumerator of all Objs. If invoked on a subclass of Obj, the result will be restricted to instances of that subclass.

Returns:



78
79
80
81
82
83
84
# File 'lib/rails_connector/basic_obj.rb', line 78

def self.all
  if superclass == RailsConnector::BasicObj
    search_for_all
  else
    find_all_by_obj_class(name)
  end
end

.find(id_or_list) ⇒ Obj+

Find an Obj by its id. If the paremeter is an Array containing ids, return a list of corresponding Objs.

Parameters:

  • id_or_list (String, Integer, Array<String, Integer>)

Returns:

  • (Obj, Array<Obj>)


46
47
48
49
50
51
52
53
54
# File 'lib/rails_connector/basic_obj.rb', line 46

def self.find(id_or_list)
  case id_or_list
  when Array
    find_objs_by(:id, id_or_list).map(&:first)
  else
    obj = find_objs_by(:id, [id_or_list.to_s]).first.first
    obj or raise ResourceNotFound, "Could not find Obj with id #{id_or_list}"
  end
end

.find_all_by_name(name) ⇒ ObjSearchEnumerator

Returns a ObjSearchEnumerator of all Objs with the given name.

Parameters:

  • name (String)

    Name of the Obj.

Returns:



121
122
123
# File 'lib/rails_connector/basic_obj.rb', line 121

def self.find_all_by_name(name)
  where(:_name, :equals, name)
end

.find_all_by_obj_class(obj_class) ⇒ ObjSearchEnumerator

Returns a ObjSearchEnumerator of all Objs with the given obj_class.

Parameters:

  • obj_class (String)

    Name of the ObjClass.

Returns:



90
91
92
# File 'lib/rails_connector/basic_obj.rb', line 90

def self.find_all_by_obj_class(obj_class)
  search_for_all.and(:_obj_class, :equals, obj_class)
end

.find_by_name(name) ⇒ Obj

Find an Obj with the given name. If several Objs with the given name exist, an arbitrary one of these Objs is chosen and returned. If no Obj with the name exits, nil is returned.

Parameters:

  • name (String)

    Name of the Obj.

Returns:

  • (Obj)


113
114
115
# File 'lib/rails_connector/basic_obj.rb', line 113

def self.find_by_name(name)
  where(:_name, :equals, name).batch_size(1).first
end

.find_by_path(path) ⇒ Obj

Find the Obj with the given path. Returns nil if no matching Obj exists.

Parameters:

  • path (String)

    Path of the Obj.

Returns:

  • (Obj)


99
100
101
# File 'lib/rails_connector/basic_obj.rb', line 99

def self.find_by_path(path)
  find_objs_by(:path, [path]).first.first
end

Returns the Obj with the given permalink, or nil if no matching Obj exists.

Parameters:

  • permalink (String)

    The permalink of the Obj.

Returns:

  • (Obj)


129
130
131
# File 'lib/rails_connector/basic_obj.rb', line 129

def self.find_by_permalink(permalink)
  find_objs_by(:permalink, [permalink]).first.first
end

.find_by_permalink!(permalink) ⇒ Obj

Returns the Obj with the given permalink, or raise ResourceNotFound if no matching Obj exists.

Parameters:

  • permalink (String)

    The permalink of the Obj.

Returns:

  • (Obj)


137
138
139
140
# File 'lib/rails_connector/basic_obj.rb', line 137

def self.find_by_permalink!(permalink)
  find_by_permalink(permalink) or
    raise ResourceNotFound, "Could not find Obj with permalink '#{permalink}'"
end

.homepageObj

Returns the homepage obj. This can be overwritten in your application’s Obj. Use #homepage? to check if an obj is the homepage.

Returns:

  • (Obj)


230
231
232
# File 'lib/rails_connector/basic_obj.rb', line 230

def self.homepage
  root
end

.rootObj

Returns the root Obj, i.e. the Obj with the path “/”

Returns:

  • (Obj)


221
222
223
224
# File 'lib/rails_connector/basic_obj.rb', line 221

def self.root
  BasicObj.find_by_path("/") or raise ResourceNotFound,
      "Obj.root not found: There is no Obj with path '/'."
end

.valid_page_classes_beneath(parent_path) ⇒ NilClass, Array<Symbol, String>

Hook method to control which page classes should be available for a page with given path. Override it to allow only certain classes or none. Must return either NilClass, or Array.

Be aware that the given argument is a parent path. E.g. when creating a page with path /products/shoes then the argument will be /products.

If NilClass is returned, then all possible classes will be available. By default NilClass is returned.

If Array is returned, then it should include desired class names. Each class name must be either a String or a Symbol. Only this class names will be available. Order of the class names will be preserved.

Parameters:

  • parent_path (String)

    Path of the parent obj

Returns:

  • (NilClass, Array<Symbol, String>)


167
168
# File 'lib/rails_connector/basic_obj.rb', line 167

def self.valid_page_classes_beneath(parent_path)
end

.where(field, operator, value, boost = nil) ⇒ ObjSearchEnumerator

Returns a ObjSearchEnumerator with the given initial subquery consisting of the four arguments.

Note that field and value can also be arrays for searching several fields or searching for several values.

ObjSearchEnumerators can be chained using one of the chainable methods (e.g. ObjSearchEnumerator#and and ObjSearchEnumerator#and_not).

Examples:

Look for the first 10 Objs whose ObjClass is “Pressrelease” and whose title contains “quarterly”:

Obj.where(:_obj_class, :equals, 'Pressrelease').and(:title, :contains, 'quarterly').take(10).map{ |obj| obj.valid_from }

Parameters:

Returns:



70
71
72
# File 'lib/rails_connector/basic_obj.rb', line 70

def self.where(field, operator, value, boost = nil)
  ObjSearchEnumerator.new(nil).and(field, operator, value, boost)
end

Instance Method Details

#[](key) ⇒ Object

Returns the value of an internal or external attribute specified by its name. Passing an invalid key will not raise an error, but return nil.



484
485
486
487
488
489
490
491
492
493
494
# File 'lib/rails_connector/basic_obj.rb', line 484

def [](key)
  key = key.to_s
  if OLD_INTERNAL_KEYS.include?(key)
    send(key)
  elsif key.start_with?('_') && OLD_INTERNAL_KEYS.include?(internal_key = key[1..-1])
    # For backwards compatibility reasons
    send(internal_key)
  else
    super
  end
end

#active?Boolean

Deprecated.

Active is deprecated without substitution.

Returns true if this object is active.

Returns:

  • (Boolean)


329
330
331
332
333
# File 'lib/rails_connector/basic_obj.rb', line 329

def active?
  Deprecation.warn_method('Obj#active?')
  return false unless valid_from
  valid_from <= Time.now && (!valid_until || Time.now <= valid_until)
end

#ancestorsArray<Obj>

Returns an Array of all the ancestor objects, starting at the root and ending at this object’s parent.

Returns:

  • (Array<Obj>)


184
185
186
187
188
189
190
191
# File 'lib/rails_connector/basic_obj.rb', line 184

def ancestors
  return [] if root?
  ancestor_paths = parent_path.scan(/\/[^\/]+/).inject([""]) do |list, component|
    list << list.last + component
  end
  ancestor_paths[0] = "/"
  BasicObj.find_many_by_paths(ancestor_paths)
end

#bodyString

Returns the body (main content) of the Obj for non-binary Objs. Returns nil for binary Objs.

Returns:

  • (String)


554
555
556
557
558
559
560
# File 'lib/rails_connector/basic_obj.rb', line 554

def body
  if binary?
    nil
  else
    StringTagging.tag_as_html(read_attribute('body'), self)
  end
end

#body_content_typeString

returns the content type of the Obj’s body for binary Objs. returns nil for non-binary Objs.

Returns:

  • (String)


589
590
591
592
593
594
595
596
597
598
# File 'lib/rails_connector/basic_obj.rb', line 589

def body_content_type
  if binary?
    blob = find_blob
    if blob
      blob.content_type
    else
      "application/octet-stream"
    end
  end
end

#body_data_urlString

returns an URL to retrieve the Obj’s body for binary Objs. returns nil for non-binary Objs.

Returns:

  • (String)


578
579
580
581
582
583
# File 'lib/rails_connector/basic_obj.rb', line 578

def body_data_url
  if binary?
    blob = find_blob
    blob.url if blob
  end
end

#body_lengthObject

for binary Objs body_length equals the file size for non-binary Objs body_length equals the number of characters in the body (main content)



565
566
567
568
569
570
571
572
# File 'lib/rails_connector/basic_obj.rb', line 565

def body_length
  if binary?
    blob = find_blob
    blob ? blob.length : 0
  else
    (body || "").length
  end
end

#childrenArray<Obj>

return a list of all child Objs.

Returns:

  • (Array<Obj>)


196
197
198
# File 'lib/rails_connector/basic_obj.rb', line 196

def children
  self.class.find_objs_by(:ppath, [path]).first
end

#content_typeString Also known as: mime_type

For a binary Obj, the content_type is equal to the content_type of its body (i.e. its data). For non-binary Objs, a the default content_type is “text/html”. Override this method in subclasses to define a different content_type. Note that only Objs with content_type “text/html” will be rendered with layout and templates by the DefaultCmsController.

Returns:

  • (String)


533
534
535
536
537
538
539
# File 'lib/rails_connector/basic_obj.rb', line 533

def content_type
  if binary?
    body_content_type
  else
    "text/html"
  end
end

#controller_action_nameString

This method determines the action that should be invoked when the Obj is requested. The default action is ‘index’. Overwrite this method to force a different action to be used.

Returns:

  • (String)


260
261
262
# File 'lib/rails_connector/basic_obj.rb', line 260

def controller_action_name
  "index"
end

#controller_nameString

This method determines the controller that should be invoked when the Obj is requested. By default a controller matching the Obj’s obj_class will be used. If the controller does not exist, the CmsController will be used as a fallback. Overwrite this method to force a different controller to be used.

Returns:

  • (String)


251
252
253
# File 'lib/rails_connector/basic_obj.rb', line 251

def controller_name
  obj_class
end

#display_titleString

Returns the title of the content or the name.

Returns:

  • (String)


287
288
289
# File 'lib/rails_connector/basic_obj.rb', line 287

def display_title
  self.title || name
end

#file_extensionString

returns the extension (the part after the last dot) from the Obj’s name. returns an empty string if no extension is present in the Obj’s name.

Returns:

  • (String)


546
547
548
# File 'lib/rails_connector/basic_obj.rb', line 546

def file_extension
  File.extname(name)[1..-1] || ""
end

#find_nearest(name) ⇒ Obj

Returns the Object with the given name next in the hierarchy returns nil if no object with the given name was found.

Parameters:

  • name (String)

Returns:

  • (Obj)


446
447
448
449
450
451
452
453
454
# File 'lib/rails_connector/basic_obj.rb', line 446

def find_nearest(name)
  obj = self.class.find_by_path(root? ? "/#{name}" : "#{path}/#{name}")

  if obj
    obj
  elsif !self.root?
    parent.find_nearest(name)
  end
end

#homepage?Boolean

Returns true if the current obj is the homepage obj.

Returns:

  • (Boolean)


266
267
268
# File 'lib/rails_connector/basic_obj.rb', line 266

def homepage?
  self == self.class.homepage
end

#idObject



35
36
37
# File 'lib/rails_connector/basic_obj.rb', line 35

def id
  read_attribute('_id')
end

#last_changedObject



512
513
514
# File 'lib/rails_connector/basic_obj.rb', line 512

def last_changed
  read_attribute('_last_changed')
end

#nameObject

returns the Obj‘s name, i.e. the last component of the path.



210
211
212
213
214
215
216
# File 'lib/rails_connector/basic_obj.rb', line 210

def name
  if root?
    ""
  else
    path.match(/[^\/]+$/)[0]
  end
end

#obj_classString

Returns:

  • (String)


507
508
509
# File 'lib/rails_connector/basic_obj.rb', line 507

def obj_class
  read_attribute('_obj_class')
end

#parentObject

return the Obj that is the parent of this Obj. returns nil for the root Obj.



177
178
179
# File 'lib/rails_connector/basic_obj.rb', line 177

def parent
  root? ? nil : BasicObj.find_by_path(parent_path)
end

#pathObject

returns the Obj‘s path as a String.



204
205
206
# File 'lib/rails_connector/basic_obj.rb', line 204

def path
  read_attribute('_path') or raise 'Obj without path'
end

returns the obj’s permalink.



241
242
243
# File 'lib/rails_connector/basic_obj.rb', line 241

def permalink
  read_attribute('_permalink')
end

#reloadObject

Reloads the attributes of this object from the database. Notice that the ruby class of this Obj instance will NOT change, even if the obj_class in the database has changed.



500
501
502
503
# File 'lib/rails_connector/basic_obj.rb', line 500

def reload
  obj_data = CmsBackend.find_obj_data_by(Workspace.current.data, :id, [id.to_s]).first.first
  update_data(obj_data)
end

#root?Boolean

Returns true if this object is the root object.

Returns:

  • (Boolean)


364
365
366
# File 'lib/rails_connector/basic_obj.rb', line 364

def root?
  path == "/"
end

#slugString

This method is used to calculate a part of a URL of this Obj.

The routing schema: <obj.id>/<obj.slug>

The default is parameterize on obj.title.

You can customize this part by overwriting #slug.

Returns:

  • (String)


280
281
282
# File 'lib/rails_connector/basic_obj.rb', line 280

def slug
  (title || '').parameterize
end

#sorted_toclist(*args) ⇒ Array<Obj>

Returns the sorted toclist, respecting sort order and type of this Obj.

Returns:

  • (Array<Obj>)


382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
# File 'lib/rails_connector/basic_obj.rb', line 382

def sorted_toclist(*args)
  list = self.toclist(*args)
  return [] if list.blank?

  cached_sort_key1 = self.sort_key1
  cached_sort_type1 = self.sort_type1

  sorted_list =
    if cached_sort_key1.blank?
      list.sort { |left_obj, right_obj| left_obj.name <=> right_obj.name }
    else
      cached_sort_key2 = self.sort_key2
      cached_sort_type2 = self.sort_type2
      cached_sort_key3 = self.sort_key3
      cached_sort_type3 = self.sort_type3

      list.sort do |left_obj, right_obj|
        compare = compare_on_sort_key(left_obj, right_obj, cached_sort_key1, cached_sort_type1)
        if compare == 0 && cached_sort_key2
          compare = compare_on_sort_key(left_obj, right_obj, cached_sort_key2, cached_sort_type2)
          if compare == 0 && cached_sort_key3
            compare = compare_on_sort_key(left_obj, right_obj, cached_sort_key3, cached_sort_type3)
          end
        end
        compare
      end
    end

  return self.sort_order == "descending" ? sorted_list.reverse : sorted_list
end

#titleObject



292
293
294
# File 'lib/rails_connector/basic_obj.rb', line 292

def title
  read_attribute('title')
end

#toclist(*args) ⇒ Array<Obj>

Returns a list of children excluding the binary? ones unless :all is specfied. This is mainly used for navigations.

Returns:

  • (Array<Obj>)


372
373
374
375
376
377
# File 'lib/rails_connector/basic_obj.rb', line 372

def toclist(*args)
  return [] unless publication?
  toclist = children
  toclist = toclist.reject { |toc| toc.binary? } unless args.include?(:all)
  toclist
end

#valid_fromObject



517
518
519
# File 'lib/rails_connector/basic_obj.rb', line 517

def valid_from
  read_attribute('_valid_from')
end

#valid_untilObject



522
523
524
# File 'lib/rails_connector/basic_obj.rb', line 522

def valid_until
  read_attribute('_valid_until')
end