diff --git a/app/controllers/draft_controller.rb b/app/controllers/draft_controller.rb index 619361e..3df03b4 100644 --- a/app/controllers/draft_controller.rb +++ b/app/controllers/draft_controller.rb @@ -30,7 +30,7 @@ def update # rubocop:disable Metrics/MethodLength, Metrics/AbcSize when :write @post.assign_attributes(post_params) @post.slug = nil # Resets FriendlyID - @post.save!(:validate => false) + @post.save!(context: :draft) unless params[:commit] == 'review' respond_to do |format| diff --git a/app/models/post.rb b/app/models/post.rb index d85e349..290860b 100644 --- a/app/models/post.rb +++ b/app/models/post.rb @@ -11,8 +11,10 @@ class Post < ApplicationRecord has_rich_text :body - validates :subject, presence: true, length: { maximum: 255 } - validate :body_cannot_be_empty + # Presence validations only apply when publishing (not in :draft context) + validates :subject, presence: true, unless: :draft_context? + validates :subject, length: { maximum: 255 } + validate :body_cannot_be_empty, unless: :draft_context? default_scope { where(archived: false).order(published_at: :desc, updated_at: :desc) } scope :published, lambda { @@ -68,6 +70,10 @@ def body_cannot_be_empty errors.add(:body, "can't be empty") if body.blank? end + def draft_context? + validation_context == :draft + end + def remove_pinned_by pinned_by&.update(pinned_post: nil) end