Class: ConstructorPages::Page

Inherits:
ActiveRecord::Base
  • Object
show all
Defined in:
pages/app/models/constructor_pages/page.rb

Overview

Page model. Pages are core for company websites, blogs etc.

Class Method Summary collapse

Instance Method Summary collapse

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(name, *args, &block) ⇒ Object

When method missing it get/set field value or get page in branch

Examples:

page.content = 'Hello world'
puts page.price
page.brand.models.each do...


177
178
179
180
181
182
183
184
# File 'pages/app/models/constructor_pages/page.rb', line 177

def method_missing(name, *args, &block)
  if new_record?
    super
  else
    name = name.to_s
    name[-1] == '=' ? set_field_value(name[0..-2], args[0]) : get_field_value(name) || find_pages_in_branch(name)
  end
end

Class Method Details

.by(params_search = nil) ⇒ Object



80
# File 'pages/app/models/constructor_pages/page.rb', line 80

def by(params_search = nil); tap {@params_search = params_search} end

.check_code_name(code_name) ⇒ Object

Check code_name for field and template. When missing method Page find field or page in branch with plural and singular code_name so field and template code_name should be uniqueness for page methods



42
43
44
45
46
47
48
# File 'pages/app/models/constructor_pages/page.rb', line 42

def check_code_name(code_name)
  [code_name, code_name.pluralize, code_name.singularize].each do |name|
    return false if Page.instance_methods.include?(name.to_sym)
  end

  true
end

.find_by_request_or_first(request = nil) ⇒ Object

Used for find page by request. It return first page if no request given or request is home page

Parameters:

  • request (defaults to: nil)

    for example '/conditioners/split-systems/zanussi'



28
29
30
# File 'pages/app/models/constructor_pages/page.rb', line 28

def find_by_request_or_first(request = nil)
  request == nil || '/' ? Page.first : Page.find_by(full_url: request)
end

.full_url_generate(parent_id, url = '') ⇒ Object

Generate full_url from parent id and url

Parameters:

  • parent_id

    integer

  • url (defaults to: '')

    should looks like 'hello-world-page' without leading slash



35
36
37
# File 'pages/app/models/constructor_pages/page.rb', line 35

def full_url_generate(parent_id, url = '')
  '/' + Page.find(parent_id).self_and_ancestors.map(&:url).append(url).join('/')
end

.in(where_search = nil) ⇒ Object



79
# File 'pages/app/models/constructor_pages/page.rb', line 79

def in(where_search  = nil); tap {@where_search  = where_search}  end

.search(what_search = nil) ⇒ Object



50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# File 'pages/app/models/constructor_pages/page.rb', line 50

def search(what_search = nil)
  if @where_search
    if @where_search.is_a?(String)
      _page = Page.find_by full_url: @where_search
    elsif @where_search.is_a?(Page)
      _page = @where_search
    end

    @result = _page ? _page.descendants : []
  else
    @result = Page.all
  end

  if what_search
    _template = Template.find_by code_name: what_search.to_s.singularize.downcase
    @result = _template ? @result.where(template: _template) : []
  end

  if @params_search
    @params_search.each_pair do |k, v|
      @result = @result.select { |p| p.send(k) == v }
    end
  end

  @where_search = @params_search = nil

  @result
end

.search_by(params_search = nil) ⇒ Object



83
# File 'pages/app/models/constructor_pages/page.rb', line 83

def search_by(params_search = nil); self.by(params_search).search end

.search_in(where_search = nil) ⇒ Object



82
# File 'pages/app/models/constructor_pages/page.rb', line 82

def search_in(where_search  = nil); self.in(where_search).search  end

Instance Method Details

#as_json(options = {}) ⇒ Object

Returns page hash attributes with fields.

Default attributes are name and title. Options param allows to add more.

Parameters:

  • options (defaults to: {})

    default merge name and title page attributes



160
161
162
163
164
165
166
# File 'pages/app/models/constructor_pages/page.rb', line 160

def as_json(options = {})
  {name: self.name, title: self.title}.merge(options).tap do |options|
    fields.each do |f|
      options.merge!({f.code_name.to_sym => f.get_value_for(self)})
    end
  end
end

#create_fields_valuesObject

Create fields values



124
# File 'pages/app/models/constructor_pages/page.rb', line 124

def create_fields_values; fields.each {|f| f.create_type_object(self) } end

#field(code_name) ⇒ Object

Get field by code_name



90
91
92
# File 'pages/app/models/constructor_pages/page.rb', line 90

def field(code_name)
  Field.find_by code_name: code_name, template_id: template_id
end

#find_page_in_branch(code_name) ⇒ Object Also known as: find_pages_in_branch

Search page by template code_name in same branch of pages and templates. It allows to call page.category.brand.series.model etc.

Return one page if founded in ancestors, and return array of pages if founded in descendants

It determines if code_name is singular or nor

Parameters:

  • code_name

    template code name



139
140
141
142
143
144
145
146
147
148
# File 'pages/app/models/constructor_pages/page.rb', line 139

def find_page_in_branch(code_name)
  _template = Template.find_by code_name: code_name.singularize

  if _template
    result = []
    result = descendants.where(template_id: _template.id) if code_name == code_name.pluralize
    result = ancestors.find_by(template_id: _template.id) if result.empty?
    result
  end
end

#get_field_value(code_name) ⇒ Object

Get value of field by code_name



95
96
97
# File 'pages/app/models/constructor_pages/page.rb', line 95

def get_field_value(code_name)
  field(code_name).tap {|f| return f.get_value_for(self) if f}
end

#published?Boolean Also known as: active?

Returns:

  • (Boolean)


152
# File 'pages/app/models/constructor_pages/page.rb', line 152

def published?; active end

#redirect?Boolean

Check if link specified

Returns:

  • (Boolean)


169
# File 'pages/app/models/constructor_pages/page.rb', line 169

def redirect?; url != link && !link.empty? end

#remove_fields_valuesObject

Remove all fields values



127
128
129
# File 'pages/app/models/constructor_pages/page.rb', line 127

def remove_fields_values
  fields.each {|f| f.remove_type_object self}
end

#search(what_search = nil) ⇒ Object



86
# File 'pages/app/models/constructor_pages/page.rb', line 86

def search(what_search = nil); Page.in(self).search(what_search) end

#search_by(params_search = nil) ⇒ Object



87
# File 'pages/app/models/constructor_pages/page.rb', line 87

def search_by(params_search = nil); Page.by(params_search).in(self).search end

#set_field_value(code_name, value) ⇒ Object

Set value of field by code_name and value



100
101
102
# File 'pages/app/models/constructor_pages/page.rb', line 100

def set_field_value(code_name, value)
  field(code_name).tap {|f| f.set_value_for(self, value) if f}
end

#update_fields_values(params, reset_booleans = true) ⇒ Object

Update all fields values with given params.

Parameters:

  • params

    should looks like {price: 500, content: 'Hello'}

  • reset_booleans (defaults to: true)

    reset all boolean fields to false before assign params



107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
# File 'pages/app/models/constructor_pages/page.rb', line 107

def update_fields_values(params, reset_booleans = true)
  return if params.nil?

  fields.each do |field|
    value = params[field.code_name.to_sym]

    _type_object = field.find_type_object(self)

    if _type_object
      _type_object.value = 0 if field.type_value == 'boolean' and reset_booleans
      _type_object.value = value if value
      _type_object.save
    end
  end
end