Class: Refinery::Page
- Inherits:
-
Core::BaseModel
- Object
- Core::BaseModel
- Refinery::Page
- Extended by:
- FriendlyId
- Defined in:
- app/models/refinery/page.rb
Defined Under Namespace
Classes: FriendlyIdOptions, FriendlyIdPath, Translation
Class Method Summary collapse
-
.by_slug(slug, conditions = {}) ⇒ Object
Finds pages by their slug.
-
.by_title(title) ⇒ Object
Finds pages by their title.
-
.fast_menu ⇒ Object
An optimised scope containing only live pages ordered for display in a menu.
-
.find_by_path(path) ⇒ Object
Find page by path, checking for scoping rules.
-
.find_by_path_or_id(path, id) ⇒ Object
Helps to resolve the situation where you have a path and an id and if the path is unfriendly then a different finder method is required than find_by_path.
-
.find_by_path_or_id!(path, id) ⇒ Object
Helps to resolve the situation where you have a path and an id and if the path is unfriendly then a different finder method is required than find_by_path.
-
.in_menu ⇒ Object
Shows all pages with :show_in_menu set to true, but it also rejects any page that has not been translated to the current locale.
-
.live ⇒ Object
Live pages are ‘allowed’ to be shown in the frontend of your website.
-
.per_page(dialog = false) ⇒ Object
Returns how many pages per page should there be when paginating pages.
- .rebuild_with_slug_nullification! ⇒ Object
-
.with_globalize(conditions = {}) ⇒ Object
Wrap up the logic of finding the pages based on the translations table.
Instance Method Summary collapse
-
#canonical ⇒ Object
The canonical page for this particular page.
-
#canonical_slug ⇒ Object
The canonical slug for this particular page.
-
#content_for(part_slug) ⇒ Object
Accessor method to get a page part from a page.
-
#content_for?(part_slug) ⇒ Boolean
Accessor method to test whether a page part exists and has content for this page.
-
#custom_slug_or_title ⇒ Object
Returns in cascading order: custom_slug or menu_title or title depending on which attribute is first found to be present for this page.
-
#deletable? ⇒ Boolean
Am I allowed to delete this page? If a link_url is set we don’t want to break the link so we don’t allow them to delete If deletable is set to false then we don’t allow this page to be deleted.
-
#destroy ⇒ Object
Before destroying a page we check to see if it’s a deletable page or not Refinery system pages are not deletable.
-
#destroy! ⇒ Object
If you want to destroy a page that is set to be not deletable this is the way to do it.
-
#in_menu? ⇒ Boolean
Return true if this page can be shown in the navigation.
-
#live? ⇒ Boolean
Returns true if this page is “published”.
-
#nested_path ⇒ Object
Returns the string version of nested_url, i.e., the path that should be generated by the router.
- #nested_url ⇒ Object (also: #uncached_nested_url)
-
#normalize_friendly_id(slug_string) ⇒ Object
Protects generated slugs from title if they are in the list of reserved words This applies mostly to plugin-generated pages.
- #not_in_menu? ⇒ Boolean
-
#part_with_slug(part_slug) ⇒ Object
Accessor method to get a page part object from a page.
- #part_with_title(part_title) ⇒ Object
-
#path(path_separator: ' - ', ancestors_first: true) ⇒ Object
Returns the full path to this page.
-
#reposition_parts! ⇒ Object
Repositions the child page_parts that belong to this page.
-
#should_generate_new_friendly_id? ⇒ Boolean
If title changes tell friendly_id to regenerate slug when saving record.
-
#shown_siblings ⇒ Object
Returns all visible sibling pages that can be rendered for the menu.
- #to_refinery_menu_item ⇒ Object
- #translated_to_default_locale? ⇒ Boolean
- #url ⇒ Object
Class Method Details
.by_slug(slug, conditions = {}) ⇒ Object
Finds pages by their slug. This method is necessary because pages are translated which means the slug attribute does not exist on the pages table thus requiring us to find the attribute on the translations table and then join to the pages table again to return the associated record.
113 114 115 |
# File 'app/models/refinery/page.rb', line 113 def by_slug(slug, conditions = {}) Pages::Finder.by_slug(slug, conditions) end |
.by_title(title) ⇒ Object
Finds pages by their title. This method is necessary because pages are translated which means the title attribute does not exist on the pages table thus requiring us to find the attribute on the translations table and then join to the pages table again to return the associated record.
105 106 107 |
# File 'app/models/refinery/page.rb', line 105 def by_title(title) Pages::Finder.by_title(title) end |
.fast_menu ⇒ Object
An optimised scope containing only live pages ordered for display in a menu.
126 127 128 |
# File 'app/models/refinery/page.rb', line 126 def live..order(arel_table[:lft]).includes(:parent, :translations) end |
.find_by_path(path) ⇒ Object
Find page by path, checking for scoping rules
77 78 79 |
# File 'app/models/refinery/page.rb', line 77 def find_by_path(path) Pages::Finder.by_path(path) end |
.find_by_path_or_id(path, id) ⇒ Object
Helps to resolve the situation where you have a path and an id and if the path is unfriendly then a different finder method is required than find_by_path.
84 85 86 |
# File 'app/models/refinery/page.rb', line 84 def find_by_path_or_id(path, id) Pages::Finder.by_path_or_id(path, id) end |
.find_by_path_or_id!(path, id) ⇒ Object
Helps to resolve the situation where you have a path and an id and if the path is unfriendly then a different finder method is required than find_by_path.
raise ActiveRecord::RecordNotFound if not found.
93 94 95 96 97 98 99 |
# File 'app/models/refinery/page.rb', line 93 def find_by_path_or_id!(path, id) page = find_by_path_or_id(path, id) raise ActiveRecord::RecordNotFound unless page page end |
.in_menu ⇒ Object
Shows all pages with :show_in_menu set to true, but it also rejects any page that has not been translated to the current locale. This works using a query against the translated content first and then using all of the page_ids we further filter against this model’s table.
121 122 123 |
# File 'app/models/refinery/page.rb', line 121 def where(:show_in_menu => true).with_globalize end |
.live ⇒ Object
Live pages are ‘allowed’ to be shown in the frontend of your website. By default, this is all pages that are not set as ‘draft’.
72 73 74 |
# File 'app/models/refinery/page.rb', line 72 def live where(:draft => false) end |
.per_page(dialog = false) ⇒ Object
Returns how many pages per page should there be when paginating pages
136 137 138 |
# File 'app/models/refinery/page.rb', line 136 def per_page(dialog = false) dialog ? Pages.pages_per_dialog : Pages.pages_per_admin_index end |
.rebuild_with_slug_nullification! ⇒ Object
140 141 142 143 |
# File 'app/models/refinery/page.rb', line 140 def rebuild_with_slug_nullification! rebuild_without_slug_nullification! nullify_duplicate_slugs_under_the_same_parent! end |
.with_globalize(conditions = {}) ⇒ Object
Wrap up the logic of finding the pages based on the translations table.
131 132 133 |
# File 'app/models/refinery/page.rb', line 131 def with_globalize(conditions = {}) Pages::Finder.with_globalize(conditions) end |
Instance Method Details
#canonical ⇒ Object
The canonical page for this particular page. Consists of:
* The default locale's translated slug
167 168 169 |
# File 'app/models/refinery/page.rb', line 167 def canonical Globalize.with_locale(::Refinery::I18n.default_frontend_locale) { url } end |
#canonical_slug ⇒ Object
The canonical slug for this particular page. This is the slug for the default frontend locale.
173 174 175 |
# File 'app/models/refinery/page.rb', line 173 def canonical_slug Globalize.with_locale(::Refinery::I18n.default_frontend_locale) { slug } end |
#content_for(part_slug) ⇒ Object
294 295 296 |
# File 'app/models/refinery/page.rb', line 294 def content_for(part_slug) part_with_slug(part_slug).try(:body) end |
#content_for?(part_slug) ⇒ Boolean
305 306 307 |
# File 'app/models/refinery/page.rb', line 305 def content_for?(part_slug) content_for(part_slug).present? end |
#custom_slug_or_title ⇒ Object
Returns in cascading order: custom_slug or menu_title or title depending on which attribute is first found to be present for this page.
179 180 181 182 |
# File 'app/models/refinery/page.rb', line 179 def custom_slug_or_title (Refinery::Pages.use_custom_slugs && custom_slug.presence) || .presence || title.presence end |
#deletable? ⇒ Boolean
Am I allowed to delete this page? If a link_url is set we don’t want to break the link so we don’t allow them to delete If deletable is set to false then we don’t allow this page to be deleted. These are often Refinery system pages
187 188 189 |
# File 'app/models/refinery/page.rb', line 187 def deletable? deletable && link_url.blank? && .blank? end |
#destroy ⇒ Object
Before destroying a page we check to see if it’s a deletable page or not Refinery system pages are not deletable.
201 202 203 204 205 206 207 |
# File 'app/models/refinery/page.rb', line 201 def destroy return super if deletable? puts_destroy_help false end |
#destroy! ⇒ Object
If you want to destroy a page that is set to be not deletable this is the way to do it.
210 211 212 213 214 |
# File 'app/models/refinery/page.rb', line 210 def destroy! self.update_attributes(:menu_match => nil, :link_url => nil, :deletable => true) self.destroy end |
#in_menu? ⇒ Boolean
Return true if this page can be shown in the navigation. If it’s a draft or is set to not show in the menu it will return false.
261 262 263 |
# File 'app/models/refinery/page.rb', line 261 def live? && end |
#live? ⇒ Boolean
Returns true if this page is “published”
255 256 257 |
# File 'app/models/refinery/page.rb', line 255 def live? !draft? end |
#nested_path ⇒ Object
Returns the string version of nested_url, i.e., the path that should be generated by the router
250 251 252 |
# File 'app/models/refinery/page.rb', line 250 def nested_path ['', nested_url].join('/') end |
#nested_url ⇒ Object Also known as: uncached_nested_url
230 231 232 233 234 235 236 237 238 |
# File 'app/models/refinery/page.rb', line 230 def nested_url Globalize.with_locale(slug_locale) do if ::Refinery::Pages.scope_slug_by_parent && !root? self_and_ancestors.includes(:translations).map(&:to_param) else [to_param.to_s] end end end |
#normalize_friendly_id(slug_string) ⇒ Object
Protects generated slugs from title if they are in the list of reserved words This applies mostly to plugin-generated pages. This only kicks in when Refinery::Pages.marketable_urls is enabled. Also check for global scoping, and if enabled, allow slashes in slug.
Returns the sluggified string
334 335 336 |
# File 'app/models/refinery/page.rb', line 334 def normalize_friendly_id(slug_string) FriendlyIdPath.normalize_friendly_id(slug_string) end |
#not_in_menu? ⇒ Boolean
265 266 267 |
# File 'app/models/refinery/page.rb', line 265 def ! end |
#part_with_slug(part_slug) ⇒ Object
315 316 317 318 319 320 321 |
# File 'app/models/refinery/page.rb', line 315 def part_with_slug(part_slug) # self.parts is usually already eager loaded so we can now just grab # the first element matching the title we specified. self.parts.detect do |part| part.slug_matches?(part_slug) end end |
#part_with_title(part_title) ⇒ Object
323 324 325 326 |
# File 'app/models/refinery/page.rb', line 323 def part_with_title(part_title) Refinery.deprecate("Refinery::Page#part_with_title", when: "3.1", replacement: "part_with_slug") part_with_slug(part_title.to_s.parameterize.underscore) end |
#path(path_separator: ' - ', ancestors_first: true) ⇒ Object
Returns the full path to this page. This automatically prints out this page title and all parent page titles. The result is joined by the path_separator argument.
219 220 221 222 223 224 |
# File 'app/models/refinery/page.rb', line 219 def path(path_separator: ' - ', ancestors_first: true) return title if root? chain = ancestors_first ? self_and_ancestors : self_and_ancestors.reverse chain.map(&:title).join(path_separator) end |
#reposition_parts! ⇒ Object
Repositions the child page_parts that belong to this page. This ensures that they are in the correct 0,1,2,3,4… etc order.
193 194 195 196 197 |
# File 'app/models/refinery/page.rb', line 193 def reposition_parts! reload.parts.each_with_index do |part, index| part.update_columns position: index end end |
#should_generate_new_friendly_id? ⇒ Boolean
If title changes tell friendly_id to regenerate slug when saving record
38 39 40 |
# File 'app/models/refinery/page.rb', line 38 def should_generate_new_friendly_id? changes.keys.include?("title") || changes.keys.include?("custom_slug") end |
#shown_siblings ⇒ Object
Returns all visible sibling pages that can be rendered for the menu
270 271 272 |
# File 'app/models/refinery/page.rb', line 270 def shown_siblings siblings.reject(&:not_in_menu?) end |
#to_refinery_menu_item ⇒ Object
274 275 276 277 278 279 280 281 282 283 284 285 286 |
# File 'app/models/refinery/page.rb', line 274 def { :id => id, :lft => lft, :depth => depth, :menu_match => , :parent_id => parent_id, :rgt => rgt, :title => .presence || title.presence, :type => self.class.name, :url => url } end |
#translated_to_default_locale? ⇒ Boolean
160 161 162 |
# File 'app/models/refinery/page.rb', line 160 def translated_to_default_locale? persisted? && translations.any?{ |t| t.locale == Refinery::I18n.default_frontend_locale} end |