77# id :integer not null, primary key
88# name :string
99# urlname :string
10- # title :string
10+ # title :string (deprecated - use draft_version.title)
1111# language_code :string
1212# language_root :boolean
1313# page_layout :string
14- # meta_keywords :text
15- # meta_description :text
14+ # meta_keywords :text (deprecated - use draft_version.meta_keywords)
15+ # meta_description :text (deprecated - use draft_version.meta_description)
1616# lft :integer
1717# rgt :integer
1818# parent_id :integer
@@ -66,11 +66,12 @@ class Page < BaseRecord
6666 depth
6767 urlname
6868 cached_tag_list
69+ title
70+ meta_description
71+ meta_keywords
6972 ]
7073
7174 PERMITTED_ATTRIBUTES = [
72- :meta_description ,
73- :meta_keywords ,
7475 :name ,
7576 :page_layout ,
7677 :public_on ,
@@ -81,10 +82,12 @@ class Page < BaseRecord
8182 :searchable ,
8283 :sitemap ,
8384 :tag_list ,
84- :title ,
8585 :urlname ,
8686 :layoutpage ,
87- :menu_id
87+ :menu_id ,
88+ {
89+ draft_version_attributes : [ :id ] + PageVersion ::METADATA_ATTRIBUTES . map ( &:to_sym )
90+ }
8891 ]
8992
9093 acts_as_nested_set ( dependent : :destroy , scope : [ :layoutpage , :language_id ] )
@@ -120,6 +123,8 @@ class Page < BaseRecord
120123 has_one :draft_version , -> { drafts } , class_name : "Alchemy::PageVersion"
121124 has_one :public_version , -> { published } , class_name : "Alchemy::PageVersion" , autosave : -> { persisted? }
122125
126+ accepts_nested_attributes_for :draft_version
127+
123128 has_many :page_ingredients , class_name : "Alchemy::Ingredients::Page" , foreign_key : :related_object_id , dependent : :nullify
124129
125130 before_validation :set_language ,
@@ -129,8 +134,7 @@ class Page < BaseRecord
129134 validates_format_of :page_layout , with : /\A [a-z0-9_-]+\z / , unless : -> { page_layout . blank? }
130135 validates_presence_of :parent , unless : -> { layoutpage? || language_root? }
131136
132- before_create -> { versions . build } ,
133- if : -> { versions . none? }
137+ after_initialize :ensure_draft_version
134138
135139 before_save :set_language_code ,
136140 if : -> { language . present? }
@@ -179,7 +183,7 @@ def url_path_class=(klass)
179183 end
180184
181185 def searchable_alchemy_resource_attributes
182- %w[ name urlname title ]
186+ %w[ name urlname ]
183187 end
184188
185189 # @return the language root page for given language id.
@@ -213,8 +217,7 @@ def copy_and_paste(source, new_parent, new_name)
213217 . call ( changed_attributes : {
214218 parent : new_parent ,
215219 language : new_parent &.language ,
216- name : new_name ,
217- title : new_name
220+ name : new_name
218221 } )
219222 if source . children . any?
220223 source . copy_children_to ( page )
@@ -458,6 +461,54 @@ def public_until
458461 attribute_fixed? ( :public_until ) ? fixed_attributes [ :public_until ] : public_version &.public_until
459462 end
460463
464+ # Returns the title from the public version, falling back to draft version
465+ #
466+ # If it's a fixed attribute then the fixed value is returned instead
467+ #
468+ def title
469+ return fixed_attributes [ :title ] if attribute_fixed? ( :title )
470+
471+ public_version &.title || draft_version &.title
472+ end
473+
474+ # Returns the meta_description from the public version, falling back to draft version
475+ #
476+ # If it's a fixed attribute then the fixed value is returned instead
477+ #
478+ def meta_description
479+ return fixed_attributes [ :meta_description ] if attribute_fixed? ( :meta_description )
480+
481+ public_version &.meta_description || draft_version &.meta_description
482+ end
483+
484+ # Returns the meta_keywords from the public version, falling back to draft version
485+ #
486+ # If it's a fixed attribute then the fixed value is returned instead
487+ #
488+ def meta_keywords
489+ return fixed_attributes [ :meta_keywords ] if attribute_fixed? ( :meta_keywords )
490+
491+ public_version &.meta_keywords || draft_version &.meta_keywords
492+ end
493+
494+ # @deprecated Use draft_version.title= instead
495+ def title = ( value )
496+ draft_version &.title = value
497+ end
498+ deprecate "title=" : :"page.draft_version.title=" , deprecator : Alchemy ::Deprecation
499+
500+ # @deprecated Use draft_version.meta_description= instead
501+ def meta_description = ( value )
502+ draft_version &.meta_description = value
503+ end
504+ deprecate "meta_description=" : :"page.draft_version.meta_description=" , deprecator : Alchemy ::Deprecation
505+
506+ # @deprecated Use draft_version.meta_keywords= instead
507+ def meta_keywords = ( value )
508+ draft_version &.meta_keywords = value
509+ end
510+ deprecate "meta_keywords=" : :"page.draft_version.meta_keywords=" , deprecator : Alchemy ::Deprecation
511+
461512 # Returns the name of the creator of this page.
462513 #
463514 # If no creator could be found or associated user model
@@ -499,9 +550,18 @@ def menus
499550
500551 private
501552
553+ def ensure_draft_version
554+ self . draft_version ||= versions . build
555+ end
556+
502557 def set_fixed_attributes
503558 fixed_attributes . all . each do |attribute , value |
504- send ( :"#{ attribute } =" , value )
559+ attribute_name = attribute . to_s
560+ if PageVersion ::METADATA_ATTRIBUTES . include? ( attribute_name )
561+ draft_version &.send ( :"#{ attribute } =" , value )
562+ else
563+ send ( :"#{ attribute } =" , value )
564+ end
505565 end
506566 end
507567
0 commit comments