lib/ecrire/app/models/post.rb in ecrire-0.26.2 vs lib/ecrire/app/models/post.rb in ecrire-0.26.3

- old
+ new

@@ -1,88 +1,157 @@ require 'nokogiri' +## +# Posts written by users stored in database +# +# == Available scopes +# +# Scopes are builtin methods to facilitate retrieving posts +# from the database. Scopes can also be chained to narrow your query +# even more. +# +# +published+: Return posts that are published +# +# +drafted+: Return posts that are NOT published +# +# +search_by_title+: Return all post that have a title that match +# the key you provide +# +# class Post < ActiveRecord::Base has_one :header, class_name: Image has_many :titles, -> { order "titles.created_at DESC" } - store_accessor :properties, :labels - + scope :published, lambda { status("published") } + scope :drafted, lambda { status("drafted") } scope :status, lambda {|status| if status.eql?("published") where "posts.published_at IS NOT NULL" else where "posts.published_at IS NULL" end } - scope :published, lambda { status("published") } - scope :drafted, lambda { status("drafted") } + scope :search_by_title, lambda {|title| + ids = Title.search_by_name(title).map(&:post_id).compact + Post.includes(:titles).where('posts.id in (?)', ids) + } + scope :without, lambda { |post| where("posts.id != ?", post.id) } validates :titles, length: {minimum: 1} before_save :update_tags attr_writer :tags + #:nodoc: def title=(new_title) if self.published? self.titles.new(name: new_title) else title = self.titles.first || self.titles.new title.post = self title.name = new_title end end + ## + # Return the current title for this post + # def title (self.titles.first || self.titles.new).name end + ## + # Return the slug link to the current title + # + def slug + self.titles.first.slug + end + + ## + # Returns the year this post was published + # def year published_at.year end + ## + # Returns the month this post was published + # def month published_at.month end - def slug - self.titles.first.slug - end - + #:nodoc: def status=(new_status) if new_status.eql? "publish" publish! end end + ## + # Publish this post if it is not yet published + # + # Update the database with the publish date + # def publish! return unless published_at.nil? self.published_at = DateTime.now save! end + ## + # Returns whether this post is published or not + # def published? !draft? end + ## + # The opposite of +published?+ + # def draft? published_at.nil? end + ## + # Returns the content of this post. Depending on the current status + # of this post, it can be one of three things: + # + # - Compiled content; + # - Markdown content; + # - Empty string. + # + # This method should be used when trying to render the body of a post + # to a page in HTML. + # def content (self.compiled_content || super || '').html_safe end + ## + # Returns the compiled excerpt for this post. + # The excerpt is based on content but only returns text. + # + # The excerpt is parsed from the content and it also + # filters out images and header. + # def excerpt (self.compiled_excerpt || "").html_safe end + ## + # Returns true if an image header was set for this post + # def header? !self.header.nil? && !self.header.url.blank? end + ## + # Returns the list of Tags link set for this post + # def tags @tags ||= Tag.where("tags.id in (?)", super || []) end protected