From 641421ec6945473eb25f1dc45fd973fa583ee55c Mon Sep 17 00:00:00 2001 From: Bell Isabell Date: Tue, 3 Mar 2026 18:49:52 -0800 Subject: [PATCH] Fix: Use validation context for drafts instead of skipping validations Replace save!(validate: false) with save!(context: :draft) to maintain data integrity while allowing drafts to be saved without subject/body. - Add draft_context? method to Post model - Make presence validations conditional on validation context - Length validation still enforced (max 255 chars for subject) Closes #23 --- app/controllers/draft_controller.rb | 2 +- app/models/post.rb | 10 ++++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) 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