Class: ConstructorPages::Page
- Inherits:
-
ActiveRecord::Base
- Object
- ActiveRecord::Base
- ConstructorPages::Page
- Defined in:
- pages/app/models/constructor_pages/page.rb
Overview
Page model. Pages are core for company websites, blogs etc.
Class Method Summary collapse
- .by(params_search = nil) ⇒ Object
-
.check_code_name(code_name) ⇒ Object
Check code_name for field and template.
-
.find_by_request_or_first(request = nil) ⇒ Object
Used for find page by request.
-
.full_url_generate(parent_id, url = '') ⇒ Object
Generate full_url from parent id and url.
- .in(where_search = nil) ⇒ Object
- .search(what_search = nil) ⇒ Object
- .search_by(params_search = nil) ⇒ Object
- .search_in(where_search = nil) ⇒ Object
Instance Method Summary collapse
-
#as_json(options = {}) ⇒ Object
Returns page hash attributes with fields.
-
#create_fields_values ⇒ Object
Create fields values.
-
#field(code_name) ⇒ Object
Get field by code_name.
-
#find_page_in_branch(code_name) ⇒ Object
(also: #find_pages_in_branch)
Search page by template code_name in same branch of pages and templates.
-
#get_field_value(code_name) ⇒ Object
Get value of field by code_name.
-
#method_missing(name, *args, &block) ⇒ Object
When method missing it get/set field value or get page in branch.
- #published? ⇒ Boolean (also: #active?)
-
#redirect? ⇒ Boolean
Check if link specified.
-
#remove_fields_values ⇒ Object
Remove all fields values.
- #search(what_search = nil) ⇒ Object
- #search_by(params_search = nil) ⇒ Object
-
#set_field_value(code_name, value) ⇒ Object
Set value of field by code_name and value.
-
#update_fields_values(params, reset_booleans = true) ⇒ Object
Update all fields values with given params.
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
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
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.
160 161 162 163 164 165 166 |
# File 'pages/app/models/constructor_pages/page.rb', line 160 def as_json( = {}) {name: self.name, title: self.title}.merge().tap do || fields.each do |f| .merge!({f.code_name.to_sym => f.get_value_for(self)}) end end end |
#create_fields_values ⇒ Object
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
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?
152 |
# File 'pages/app/models/constructor_pages/page.rb', line 152 def published?; active end |
#redirect? ⇒ Boolean
Check if link specified
169 |
# File 'pages/app/models/constructor_pages/page.rb', line 169 def redirect?; url != link && !link.empty? end |
#remove_fields_values ⇒ Object
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.
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 |