monologue 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/MIT-LICENSE +1 -1
- data/README.md +28 -6
- data/app/assets/images/monologue/admin/select2.png +0 -0
- data/app/assets/javascripts/monologue/admin/application.js +6 -2
- data/app/assets/javascripts/monologue/admin/ckeditor-config.js +21 -0
- data/app/assets/javascripts/monologue/admin/posts.js +62 -0
- data/app/assets/stylesheets/monologue/admin/application.css +2 -1
- data/app/assets/stylesheets/monologue/admin/posts.sass +21 -0
- data/app/assets/stylesheets/monologue/blog/application.css +1 -1
- data/app/assets/stylesheets/monologue/blog/monologue.css +12 -1
- data/app/controllers/monologue/admin/base_controller.rb +2 -2
- data/app/controllers/monologue/admin/posts_controller.rb +31 -44
- data/app/controllers/monologue/admin/sessions_controller.rb +2 -2
- data/app/controllers/monologue/admin/users_controller.rb +39 -3
- data/app/controllers/monologue/application_controller.rb +7 -7
- data/app/controllers/monologue/posts_controller.rb +5 -7
- data/app/controllers/monologue/tags_controller.rb +8 -3
- data/app/form_builders/monologue_admin_form_builder.rb +12 -8
- data/app/helpers/monologue/application_helper.rb +9 -39
- data/app/helpers/monologue/html_helper.rb +35 -0
- data/app/helpers/monologue/tags_helper.rb +25 -0
- data/app/models/monologue/post.rb +38 -23
- data/app/models/monologue/tag.rb +3 -4
- data/app/models/monologue/tagging.rb +2 -0
- data/app/models/monologue/user.rb +13 -2
- data/app/sweepers/monologue/posts_sweeper.rb +2 -5
- data/app/views/layouts/monologue/admin.html.erb +2 -2
- data/app/views/layouts/monologue/admin/_nav_bar.html.erb +8 -16
- data/app/views/layouts/monologue/application.html.erb +1 -1
- data/app/views/layouts/monologue/application/_fb_open_graph.html.erb +2 -2
- data/app/views/layouts/monologue/application/_sidebar.html.erb +3 -1
- data/app/views/layouts/monologue/application/_twitter_cards.html.erb +2 -2
- data/app/views/monologue/admin/cache/_config.html.erb +1 -1
- data/app/views/monologue/admin/cache/show.html.erb +1 -1
- data/app/views/monologue/admin/posts/_form.html.erb +23 -9
- data/app/views/monologue/admin/posts/edit.html.erb +3 -3
- data/app/views/monologue/admin/posts/index.html.erb +5 -3
- data/app/views/monologue/admin/posts/new.html.erb +1 -1
- data/app/views/monologue/admin/sessions/new.html.erb +1 -1
- data/app/views/monologue/admin/users/_form.html.erb +5 -0
- data/app/views/monologue/admin/users/edit.html.erb +3 -7
- data/app/views/monologue/admin/users/index.html.erb +28 -0
- data/app/views/monologue/admin/users/new.html.erb +5 -0
- data/app/views/monologue/posts/_pagination.html.erb +2 -2
- data/app/views/monologue/posts/_post.html.erb +6 -8
- data/app/views/monologue/posts/_post_header.html.erb +16 -0
- data/app/views/monologue/posts/_social_sharing.html.erb +6 -6
- data/app/views/monologue/posts/feed.rss.builder +7 -8
- data/app/views/monologue/posts/index.html.erb +1 -1
- data/app/views/monologue/posts/show.html.erb +8 -8
- data/app/views/monologue/sidebar/_latest_posts.html.erb +1 -1
- data/app/views/monologue/sidebar/_latest_tweets.html.erb +1 -1
- data/app/views/monologue/sidebar/_tag_cloud.html.erb +1 -1
- data/config/locales/en.yml +81 -112
- data/config/locales/es.yml +148 -0
- data/config/locales/fr.yml +76 -110
- data/config/locales/it.yml +147 -0
- data/config/locales/pt.yml +147 -0
- data/config/locales/ro.yml +78 -110
- data/config/routes.rb +12 -10
- data/db/migrate/20120120193858_create_monologue_posts_revisions.rb +1 -1
- data/db/migrate/20120514194459_join_posts_and_tags.rb +1 -1
- data/db/migrate/20120526131841_migrate_old_urls.rb +3 -0
- data/db/migrate/20120612015727_delete_join_posts_tags.rb +1 -1
- data/db/migrate/20130108123111_move_user_id_to_post.rb +31 -0
- data/db/migrate/20130509015400_merge_revisions_into_posts.rb +40 -0
- data/db/seeds.rb +1 -1
- data/lib/monologue/engine.rb +6 -6
- data/lib/monologue/version.rb +1 -1
- data/lib/tasks/monologue_cache.rake +1 -1
- data/vendor/assets/javascripts/monologue/bootstrap/bootstrap-datepicker-es.js +7 -0
- data/vendor/assets/javascripts/monologue/bootstrap/bootstrap-datepicker-it.js +9 -0
- data/vendor/assets/javascripts/monologue/bootstrap/bootstrap-datepicker-pt.js +9 -0
- metadata +88 -78
- data/app/assets/javascripts/monologue/admin/tinymce-config.js +0 -21
- data/app/models/monologue/posts_revision.rb +0 -61
- data/app/views/monologue/posts/_revision_header.html.erb +0 -9
@@ -9,7 +9,7 @@ class Monologue::ApplicationController < ApplicationController
|
|
9
9
|
end
|
10
10
|
|
11
11
|
def all_tags
|
12
|
-
@tags = Monologue::Tag.all(:
|
12
|
+
@tags = Monologue::Tag.all(order: "name").select{|t| t.frequency>0}
|
13
13
|
#could use minmax here but it's only supported with ruby > 1.9'
|
14
14
|
@tags_frequency_min = @tags.map{|t| t.frequency}.min
|
15
15
|
@tags_frequency_max = @tags.map{|t| t.frequency}.max
|
@@ -19,22 +19,22 @@ class Monologue::ApplicationController < ApplicationController
|
|
19
19
|
# fallback to the default 404.html page from main_app.
|
20
20
|
file = Rails.root.join('public', '404.html')
|
21
21
|
if file.exist?
|
22
|
-
render :
|
23
|
-
:
|
22
|
+
render file: file.cleanpath.to_s.gsub(%r{#{file.extname}$}, ''),
|
23
|
+
layout: false, status: 404, formats: [:html]
|
24
24
|
else
|
25
|
-
render :
|
25
|
+
render action: "404", status: 404, formats: [:html]
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
29
29
|
private
|
30
30
|
|
31
|
-
def
|
31
|
+
def monologue_current_user
|
32
32
|
@monologue_current_user ||= Monologue::User.find(session[:monologue_user_id]) if session[:monologue_user_id]
|
33
33
|
end
|
34
34
|
|
35
35
|
def monologue_page_cache_enabled?
|
36
|
-
|
36
|
+
monologue_current_user.nil? && Monologue::PageCache.enabled
|
37
37
|
end
|
38
38
|
|
39
|
-
helper_method :
|
39
|
+
helper_method :monologue_current_user, :monologue_page_cache_enabled?
|
40
40
|
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
class Monologue::PostsController < Monologue::ApplicationController
|
2
|
-
caches_page :index, :show, :feed , :
|
2
|
+
caches_page :index, :show, :feed , if: Proc.new { monologue_page_cache_enabled? }
|
3
3
|
|
4
4
|
def index
|
5
5
|
@page = params[:page].nil? ? 1 : params[:page]
|
@@ -7,16 +7,14 @@ class Monologue::PostsController < Monologue::ApplicationController
|
|
7
7
|
end
|
8
8
|
|
9
9
|
def show
|
10
|
-
if
|
11
|
-
post = Monologue::Post.default.where("
|
10
|
+
if monologue_current_user
|
11
|
+
@post = Monologue::Post.default.where("url = :url", {url: params[:post_url]}).first
|
12
12
|
else
|
13
|
-
post = Monologue::Post.published.where("
|
13
|
+
@post = Monologue::Post.published.where("url = :url", {url: params[:post_url]}).first
|
14
14
|
end
|
15
|
-
if post.nil?
|
15
|
+
if @post.nil?
|
16
16
|
not_found
|
17
|
-
return
|
18
17
|
end
|
19
|
-
@revision = post.active_revision
|
20
18
|
end
|
21
19
|
|
22
20
|
def feed
|
@@ -1,12 +1,17 @@
|
|
1
1
|
class Monologue::TagsController < Monologue::ApplicationController
|
2
|
-
caches_page :show , :
|
2
|
+
caches_page :show , if: Proc.new { monologue_page_cache_enabled? }
|
3
3
|
def show
|
4
|
-
@tag =
|
4
|
+
@tag = retrieve_tag
|
5
5
|
if @tag
|
6
6
|
@page = nil
|
7
7
|
@posts = @tag.posts_with_tag
|
8
8
|
else
|
9
|
-
redirect_to :root
|
9
|
+
redirect_to :root ,notice: "No post found with label \"#{params[:tag]}\""
|
10
10
|
end
|
11
11
|
end
|
12
|
+
|
13
|
+
private
|
14
|
+
def retrieve_tag
|
15
|
+
Monologue::Tag.where("lower(name) = ?", params[:tag].downcase).first
|
16
|
+
end
|
12
17
|
end
|
@@ -1,9 +1,9 @@
|
|
1
1
|
class MonologueAdminFormBuilder < ActionView::Helpers::FormBuilder
|
2
|
-
delegate :content_tag, :tag, :
|
2
|
+
delegate :content_tag, :tag, to: :@template
|
3
3
|
|
4
4
|
%w[text_field text_area password_field collection_select select file_field].each do |method_name|
|
5
5
|
define_method(method_name) do |name, *args|
|
6
|
-
content_tag :div, :
|
6
|
+
content_tag :div, class: "field" do
|
7
7
|
field_label(name, *args) + super(name, *args)
|
8
8
|
end
|
9
9
|
end
|
@@ -12,31 +12,31 @@ class MonologueAdminFormBuilder < ActionView::Helpers::FormBuilder
|
|
12
12
|
def check_box(name, *args)
|
13
13
|
options = args.extract_options!
|
14
14
|
required = object.class.validators_on(name).any? { |v| v.kind_of? ActiveModel::Validations::PresenceValidator }
|
15
|
-
content_tag :label, :
|
15
|
+
content_tag :label, class: (required ? "required checkbox inline" : "checkbox inline") do
|
16
16
|
super + (options[:label] || name)
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
20
20
|
def collection_check_boxes(attribute, records, record_id, record_name)
|
21
|
-
content_tag :div, :
|
21
|
+
content_tag :div, class: "field" do
|
22
22
|
@template.hidden_field_tag("#{object_name}[#{attribute}][]") +
|
23
23
|
records.map do |record|
|
24
24
|
element_id = "#{object_name}_#{attribute}_#{record.send(record_id)}"
|
25
|
-
checkbox = @template.check_box_tag("#{object_name}[#{attribute}][]", record.send(record_id), object.send(attribute).include?(record.send(record_id)), :
|
25
|
+
checkbox = @template.check_box_tag("#{object_name}[#{attribute}][]", record.send(record_id), object.send(attribute).include?(record.send(record_id)), id: element_id)
|
26
26
|
checkbox + " " + @template.label_tag(element_id, record.send(record_name))
|
27
27
|
end.join(tag(:br)).html_safe
|
28
28
|
end
|
29
29
|
end
|
30
30
|
|
31
31
|
def submit(*args)
|
32
|
-
content_tag :div, :
|
32
|
+
content_tag :div, class: "form-actions" do
|
33
33
|
super
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
37
37
|
def error_messages
|
38
38
|
if object.errors.full_messages.any?
|
39
|
-
content_tag(:div, :
|
39
|
+
content_tag(:div, class: "alert alert-error error_messages") do
|
40
40
|
content_tag(:strong, "Invalid Fields") +
|
41
41
|
content_tag(:ul) do
|
42
42
|
object.errors.messages.map do |msg|
|
@@ -52,7 +52,11 @@ class MonologueAdminFormBuilder < ActionView::Helpers::FormBuilder
|
|
52
52
|
def field_label(name, *args)
|
53
53
|
options = args.extract_options!
|
54
54
|
required = object.class.validators_on(name).any? { |v| v.kind_of? ActiveModel::Validations::PresenceValidator }
|
55
|
-
|
55
|
+
if options[:id]
|
56
|
+
label(name, options[:label], class: ("required" if required), for: options[:id])
|
57
|
+
else
|
58
|
+
label(name, options[:label], class: ("required" if required))
|
59
|
+
end
|
56
60
|
end
|
57
61
|
|
58
62
|
def objectify_options(options)
|
@@ -1,8 +1,9 @@
|
|
1
1
|
module Monologue
|
2
2
|
module ApplicationHelper
|
3
3
|
include Monologue::Engine.routes.url_helpers if ENV["RAILS_ENV"] == "test" # TODO: try and see why this is needed for specs to pass
|
4
|
-
#
|
5
|
-
|
4
|
+
#Why aren't they loaded by default?
|
5
|
+
include Monologue::HtmlHelper
|
6
|
+
include Monologue::TagsHelper
|
6
7
|
|
7
8
|
def monologue_admin_form_for(object, options = {}, &block)
|
8
9
|
options[:builder] = MonologueAdminFormBuilder
|
@@ -13,15 +14,8 @@ module Monologue
|
|
13
14
|
content_for?(:title) ? ((content_for :title) + " | #{Monologue.site_name}") : Monologue.site_name
|
14
15
|
end
|
15
16
|
|
16
|
-
def sidebar_section_for(title, &block)
|
17
|
-
content_tag(:section, :class => 'widget') do
|
18
|
-
content_tag(:header, content_tag(:h1, title)) +
|
19
|
-
capture(&block)
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
17
|
def rss_head_link
|
24
|
-
tag("link", :
|
18
|
+
tag("link", href: feed_url, rel: "alternate", title: "RSS", type: "application/rss+xml")
|
25
19
|
end
|
26
20
|
|
27
21
|
def rss_icon
|
@@ -49,40 +43,16 @@ module Monologue
|
|
49
43
|
end
|
50
44
|
|
51
45
|
def absolute_image_url(url)
|
52
|
-
|
53
|
-
|
54
|
-
end
|
55
|
-
|
56
|
-
# TODO: That should be move in TagHelper if I manage to get that loaded
|
57
|
-
def tag_url(tag)
|
58
|
-
"#{Monologue::Engine.routes.url_helpers.root_path}tags/#{tag.name.downcase}"
|
59
|
-
end
|
60
|
-
|
61
|
-
def label_for_tag(tag, min, max)
|
62
|
-
"label-size-#{size_for_tag(tag, min, max)}"
|
46
|
+
return url if url.starts_with? "http"
|
47
|
+
request.protocol + request.host + url
|
63
48
|
end
|
64
49
|
|
65
|
-
def
|
66
|
-
#logarithmic scaling based on the number of occurrences of each tag
|
67
|
-
if min<max && tag.frequency>0
|
68
|
-
1 + ((NUMBER_OF_LABEL_SIZES-1)*(log_distance_to_min(tag.frequency, min))/log_distance_to_min(max, min)).round
|
69
|
-
else
|
70
|
-
1
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
private
|
75
|
-
def social_icon foundicon, url, setting
|
50
|
+
def social_icon(foundicon, url, setting)
|
76
51
|
return if setting.nil? || !setting
|
77
|
-
content_tag :a, :
|
78
|
-
content_tag :i, :
|
52
|
+
content_tag :a, href: url, class: "social", target: "_blank" do
|
53
|
+
content_tag :i, class: "foundicon-#{foundicon}" do # using an empty content tag for foundicons to appear. TODO: try to do otherwise and use only tag method
|
79
54
|
end
|
80
55
|
end
|
81
56
|
end
|
82
|
-
|
83
|
-
def log_distance_to_min(value, min)
|
84
|
-
Math.log(value)-Math.log(min)
|
85
|
-
end
|
86
|
-
|
87
57
|
end
|
88
58
|
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Monologue
|
2
|
+
module HtmlHelper
|
3
|
+
|
4
|
+
|
5
|
+
# +li+ tag with the 'active' class added if the url is the current one.
|
6
|
+
# Eg.:
|
7
|
+
#
|
8
|
+
# <%= activable_li_tag users_path do %>
|
9
|
+
# <%= link_to "Users", users_path %>
|
10
|
+
# <% end %>
|
11
|
+
#
|
12
|
+
def activable_li_tag(*url, &block)
|
13
|
+
content_tag :li, capture(&block), :class => ("active" if url.any?{|u| current_page?(u)})
|
14
|
+
end
|
15
|
+
|
16
|
+
# +li+ tag with the 'active' class added if the url is the current one with a link
|
17
|
+
# inside it pointing to that url.
|
18
|
+
#
|
19
|
+
# <%= activatable_li_tag_with_link "Users", users_path %>
|
20
|
+
#
|
21
|
+
def activable_li_tag_with_link(title, *url)
|
22
|
+
activable_li_tag *url do
|
23
|
+
link_to(title, url.first)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def sidebar_section_for(title, &block)
|
28
|
+
content_tag(:section, class: 'widget') do
|
29
|
+
content_tag(:header, content_tag(:h1, title)) +
|
30
|
+
capture(&block)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
end
|
@@ -1,5 +1,30 @@
|
|
1
1
|
module Monologue
|
2
2
|
module TagsHelper
|
3
3
|
|
4
|
+
#Number of sizes defined in the css
|
5
|
+
NUMBER_OF_LABEL_SIZES = 5
|
6
|
+
|
7
|
+
def tag_url(tag)
|
8
|
+
"#{Monologue::Engine.routes.url_helpers.root_path}tags/#{tag.name.downcase}"
|
9
|
+
end
|
10
|
+
|
11
|
+
def label_for_tag(tag, min, max)
|
12
|
+
"label-size-#{size_for_tag(tag, min, max)}"
|
13
|
+
end
|
14
|
+
|
15
|
+
def size_for_tag(tag, min, max)
|
16
|
+
#logarithmic scaling based on the number of occurrences of each tag
|
17
|
+
if min<max && tag.frequency>0
|
18
|
+
1 + ((NUMBER_OF_LABEL_SIZES-1)*(log_distance_to_min(tag.frequency, min))/log_distance_to_min(max, min)).round
|
19
|
+
else
|
20
|
+
1
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def log_distance_to_min(value, min)
|
27
|
+
Math.log(value)-Math.log(min)
|
28
|
+
end
|
4
29
|
end
|
5
30
|
end
|
@@ -1,46 +1,48 @@
|
|
1
1
|
class Monologue::Post < ActiveRecord::Base
|
2
|
-
has_many :posts_revisions, :dependent => :destroy
|
3
2
|
has_many :taggings
|
4
|
-
has_many :tags, :
|
3
|
+
has_many :tags, through: :taggings, dependent: :destroy
|
4
|
+
before_validation :generate_url
|
5
|
+
belongs_to :user
|
5
6
|
|
6
|
-
|
7
|
-
attr_writer :tag_list
|
8
|
-
attr_accessible :posts_revisions_attributes, :published, :tag_list
|
7
|
+
attr_accessible :title, :content, :url, :published, :published_at, :tag_list
|
9
8
|
|
10
|
-
scope :default,
|
11
|
-
scope :published, lambda { default.where(:
|
9
|
+
scope :default, order("published_at DESC, monologue_posts.created_at DESC, monologue_posts.updated_at DESC")
|
10
|
+
scope :published, lambda { default.where(published: true).where("published_at <= ?", DateTime.now) }
|
12
11
|
|
13
12
|
default_scope includes(:tags)
|
14
13
|
|
15
|
-
validates :
|
14
|
+
validates :user_id, presence: true
|
15
|
+
validates :title, :content, :url, :published_at, presence: true
|
16
|
+
validates :url, uniqueness: true
|
17
|
+
validate :url_do_not_start_with_slash
|
16
18
|
|
17
|
-
|
18
|
-
|
19
|
-
self.posts_revisions.where("post_id = ?", self.id).order("monologue_posts_revisions.updated_at DESC").offset(1).limit(1).first
|
19
|
+
def tag_list= tags_attr
|
20
|
+
self.tag!(tags_attr.split(","))
|
20
21
|
end
|
21
22
|
|
22
|
-
def
|
23
|
-
self.
|
23
|
+
def tag_list
|
24
|
+
self.tags.map { |tag| tag.name }.join(", ") if self.tags
|
24
25
|
end
|
25
26
|
|
26
|
-
def
|
27
|
-
|
27
|
+
def tag!(tags_attr)
|
28
|
+
self.tags = tags_attr.map(&:strip).reject(&:blank?).map do |tag|
|
29
|
+
Monologue::Tag.find_or_create_by_name(tag)
|
30
|
+
end
|
28
31
|
end
|
29
32
|
|
30
|
-
def
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
end
|
33
|
+
def full_url
|
34
|
+
"#{Monologue::Engine.routes.url_helpers.root_path}#{self.url}"
|
35
|
+
end
|
36
|
+
|
37
|
+
def published_in_future?
|
38
|
+
self.published && self.published_at > DateTime.now
|
37
39
|
end
|
38
40
|
|
39
41
|
def self.page p
|
40
42
|
per_page = Monologue.posts_per_page || 10
|
41
43
|
set_total_pages(per_page)
|
42
44
|
p = (p.nil? ? 0 : p.to_i - 1)
|
43
|
-
offset =
|
45
|
+
offset = p * per_page
|
44
46
|
self.limit(per_page).offset(offset)
|
45
47
|
end
|
46
48
|
|
@@ -51,4 +53,17 @@ class Monologue::Post < ActiveRecord::Base
|
|
51
53
|
def self.set_total_pages per_page
|
52
54
|
@number_of_pages = self.count / per_page + (self.count % per_page == 0 ? 0 : 1)
|
53
55
|
end
|
56
|
+
|
57
|
+
private
|
58
|
+
|
59
|
+
def generate_url
|
60
|
+
return unless self.url.blank?
|
61
|
+
year = self.published_at.class == ActiveSupport::TimeWithZone ? self.published_at.year : DateTime.now.year
|
62
|
+
self.url = "#{year}/#{self.title.parameterize}"
|
63
|
+
end
|
64
|
+
|
65
|
+
def url_do_not_start_with_slash
|
66
|
+
errors.add(:url, I18n.t("activerecord.errors.models.monologue/post.attributes.url.start_with_slash")) if self.url.start_with?("/")
|
67
|
+
end
|
68
|
+
|
54
69
|
end
|
data/app/models/monologue/tag.rb
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
class Monologue::Tag < ActiveRecord::Base
|
2
2
|
attr_accessible :name
|
3
3
|
|
4
|
-
validates :name, :
|
4
|
+
validates :name, uniqueness: true,presence: true
|
5
5
|
has_many :taggings
|
6
|
-
has_many :posts
|
6
|
+
has_many :posts,through: :taggings
|
7
7
|
|
8
8
|
def posts_with_tag
|
9
9
|
self.posts.published
|
@@ -12,5 +12,4 @@ class Monologue::Tag < ActiveRecord::Base
|
|
12
12
|
def frequency
|
13
13
|
posts_with_tag.size
|
14
14
|
end
|
15
|
-
|
16
|
-
end
|
15
|
+
end
|
@@ -1,7 +1,18 @@
|
|
1
1
|
class Monologue::User < ActiveRecord::Base
|
2
2
|
has_many :posts
|
3
|
+
|
3
4
|
attr_accessible :name, :email, :password, :password_confirmation
|
5
|
+
|
4
6
|
has_secure_password
|
5
|
-
|
6
|
-
validates_presence_of :
|
7
|
+
|
8
|
+
validates_presence_of :password, on: :create
|
9
|
+
validates_presence_of :name
|
10
|
+
validates :email , presence: true, uniqueness: true
|
11
|
+
|
12
|
+
|
13
|
+
def can_delete?(user)
|
14
|
+
return false if self==user
|
15
|
+
return false if user.posts.any?
|
16
|
+
true
|
17
|
+
end
|
7
18
|
end
|
@@ -15,11 +15,8 @@ class Monologue::PostsSweeper < ActionController::Caching::Sweeper
|
|
15
15
|
page_cache_directory = Rails.public_path if page_cache_directory.nil? # TODO: we should not need this either...
|
16
16
|
|
17
17
|
# post
|
18
|
-
|
19
|
-
|
20
|
-
current_post_path = "#{page_cache_directory}#{root_path}#{post.posts_revisions.last.url}.html" if post.posts_revisions.count == 1
|
21
|
-
File.delete current_post_path if File.exists? current_post_path
|
22
|
-
end
|
18
|
+
current_post_path = "#{page_cache_directory}#{root_path}#{post.url}.html"
|
19
|
+
File.delete current_post_path if File.exists? current_post_path
|
23
20
|
|
24
21
|
# tags
|
25
22
|
tags_path = "#{page_cache_directory}#{root_path}tags"
|
@@ -7,12 +7,12 @@
|
|
7
7
|
<%= csrf_meta_tags %>
|
8
8
|
</head>
|
9
9
|
<body>
|
10
|
-
<% if
|
10
|
+
<% if monologue_current_user %>
|
11
11
|
<%= render "layouts/monologue/admin/nav_bar" %>
|
12
12
|
<% end %>
|
13
13
|
<div class="container">
|
14
14
|
<% flash.each do |name, msg| %>
|
15
|
-
<%= content_tag :div, msg, :
|
15
|
+
<%= content_tag :div, msg, id: "flash_#{name}", class: (name == :notice ? "alert alert-info" : "alert alert-error") %>
|
16
16
|
<% end %>
|
17
17
|
|
18
18
|
<%= yield %>
|