class Blog < ApplicationRecord include Recordable include Votable acts_as_taggable has_many :comments belongs_to :user has_many_attached :images do |attachable| attachable.variant :thumb, resize_to_limit: [300, 300] end validates :title, presence: true validates :body, presence: true, if: :published validates :slug, presence: true, format: /\A[-a-z0-9]+\z/, if: :published validates :user, presence: true validates :images, content_type: ['image/png', 'image/jpeg'] before_validation :set_draft_title before_save :set_published_at after_save :send_webmentions def path "/says/#{slug}" end def taggable self end def has_read_more body.include?("") end def short_body body[0..(body.index("")-1)] end def to_param slug end def visible_date if published published_at else updated_at end end def prev Blog.where(published: true).where("published_at < ?", published_at).order(published_at: :desc).first end def next Blog.where(published: true).where("published_at > ?", published_at).order(published_at: :asc).first end private def set_draft_title if self.title.blank? and not self.published self.title = "Untitled draft" end end def set_published_at if self.published if self.published_at.blank? self.published_at = DateTime.now end else self.published_at = nil end end def send_webmentions return unless self.published SendWebmentionsJob.perform_later self end end