blogit 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/MIT-LICENSE +20 -0
- data/README.md +3 -0
- data/Rakefile +39 -0
- data/app/assets/javascripts/blogit/index.js +1 -0
- data/app/assets/stylesheets/blogit/comments.css +16 -0
- data/app/assets/stylesheets/blogit/index.css +3 -0
- data/app/assets/stylesheets/blogit/posts.css +59 -0
- data/app/controllers/blogit/application_controller.rb +41 -0
- data/app/controllers/blogit/comments_controller.rb +44 -0
- data/app/controllers/blogit/posts_controller.rb +55 -0
- data/app/helpers/blogit/application_helper.rb +64 -0
- data/app/helpers/blogit/comments_helper.rb +19 -0
- data/app/helpers/blogit/posts_helper.rb +26 -0
- data/app/models/blogit/comment.rb +59 -0
- data/app/models/blogit/post.rb +57 -0
- data/app/views/blogit/comments/_comment.html.erb +16 -0
- data/app/views/blogit/comments/_form.html.erb +42 -0
- data/app/views/blogit/comments/create.js.erb +7 -0
- data/app/views/blogit/comments/destroy.js.erb +1 -0
- data/app/views/blogit/posts/_blog_post_spacer.html.erb +1 -0
- data/app/views/blogit/posts/_blogger_information.html.erb +4 -0
- data/app/views/blogit/posts/_comments_count.html.erb +5 -0
- data/app/views/blogit/posts/_form.html.erb +43 -0
- data/app/views/blogit/posts/_pagination.html.erb +1 -0
- data/app/views/blogit/posts/_post.html.erb +19 -0
- data/app/views/blogit/posts/_post_body.html.erb +1 -0
- data/app/views/blogit/posts/_post_head.html.erb +3 -0
- data/app/views/blogit/posts/_post_links.html.erb +5 -0
- data/app/views/blogit/posts/edit.html.erb +3 -0
- data/app/views/blogit/posts/index.html.erb +10 -0
- data/app/views/blogit/posts/new.html.erb +3 -0
- data/app/views/blogit/posts/show.html.erb +7 -0
- data/config/routes.rb +9 -0
- data/db/migrate/20110814091434_create_blog_posts.rb +12 -0
- data/db/migrate/20110814093229_create_blog_comments.rb +15 -0
- data/db/migrate/20110814103306_acts_as_taggable_on_migration.rb +28 -0
- data/lib/blogit.rb +24 -0
- data/lib/blogit/blogs.rb +19 -0
- data/lib/blogit/configuration.rb +74 -0
- data/lib/blogit/engine.rb +14 -0
- data/lib/blogit/parsers.rb +5 -0
- data/lib/blogit/parsers/html_parser.rb +9 -0
- data/lib/blogit/parsers/markdown_parser.rb +21 -0
- data/lib/blogit/parsers/textile_parser.rb +13 -0
- data/lib/blogit/version.rb +3 -0
- data/lib/generators/blogit/USAGE +8 -0
- data/lib/generators/blogit/install_generator.rb +15 -0
- data/lib/generators/templates/blogit.rb +42 -0
- data/lib/tasks/blog_tasks.rake +4 -0
- data/lib/validators.rb +3 -0
- data/lib/validators/absence_validator.rb +13 -0
- data/spec/blogit_spec.rb +20 -0
- data/spec/controllers/blogit/comments_controller_spec.rb +111 -0
- data/spec/controllers/blogit/posts_controller_spec.rb +261 -0
- data/spec/dummy/Rakefile +7 -0
- data/spec/dummy/app/assets/javascripts/application.js +3 -0
- data/spec/dummy/app/assets/stylesheets/application.css +18 -0
- data/spec/dummy/app/controllers/application_controller.rb +19 -0
- data/spec/dummy/app/controllers/people_controller.rb +83 -0
- data/spec/dummy/app/controllers/sessions_controller.rb +23 -0
- data/spec/dummy/app/controllers/users_controller.rb +83 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/helpers/people_helper.rb +2 -0
- data/spec/dummy/app/helpers/sessions_helper.rb +2 -0
- data/spec/dummy/app/helpers/users_helper.rb +2 -0
- data/spec/dummy/app/models/person.rb +2 -0
- data/spec/dummy/app/models/user.rb +11 -0
- data/spec/dummy/app/views/layouts/application.html.erb +28 -0
- data/spec/dummy/app/views/people/_form.html.erb +21 -0
- data/spec/dummy/app/views/people/edit.html.erb +6 -0
- data/spec/dummy/app/views/people/index.html.erb +23 -0
- data/spec/dummy/app/views/people/new.html.erb +5 -0
- data/spec/dummy/app/views/people/show.html.erb +10 -0
- data/spec/dummy/app/views/sessions/new.html.erb +17 -0
- data/spec/dummy/app/views/users/_form.html.erb +25 -0
- data/spec/dummy/app/views/users/edit.html.erb +6 -0
- data/spec/dummy/app/views/users/index.html.erb +25 -0
- data/spec/dummy/app/views/users/new.html.erb +5 -0
- data/spec/dummy/app/views/users/show.html.erb +15 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/config/application.rb +25 -0
- data/spec/dummy/config/boot.rb +10 -0
- data/spec/dummy/config/database.yml +25 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +30 -0
- data/spec/dummy/config/environments/production.rb +51 -0
- data/spec/dummy/config/environments/test.rb +39 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/blogit.rb +40 -0
- data/spec/dummy/config/initializers/inflections.rb +10 -0
- data/spec/dummy/config/initializers/mime_types.rb +5 -0
- data/spec/dummy/config/initializers/secret_token.rb +7 -0
- data/spec/dummy/config/initializers/session_store.rb +8 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +12 -0
- data/spec/dummy/config/locales/en.yml +5 -0
- data/spec/dummy/config/routes.rb +11 -0
- data/spec/dummy/db/development.sqlite3 +0 -0
- data/spec/dummy/db/migrate/20110814091304_create_users.rb +10 -0
- data/spec/dummy/db/migrate/20110819103335_create_people.rb +9 -0
- data/spec/dummy/db/schema.rb +71 -0
- data/spec/dummy/db/test.sqlite3 +0 -0
- data/spec/dummy/log/development.log +21145 -0
- data/spec/dummy/log/test.log +32053 -0
- data/spec/dummy/public/404.html +26 -0
- data/spec/dummy/public/422.html +26 -0
- data/spec/dummy/public/500.html +26 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/dummy/script/rails +6 -0
- data/spec/dummy/test/fixtures/people.yml +7 -0
- data/spec/dummy/test/fixtures/users.yml +9 -0
- data/spec/dummy/test/functional/people_controller_test.rb +49 -0
- data/spec/dummy/test/functional/sessions_controller_test.rb +9 -0
- data/spec/dummy/test/functional/users_controller_test.rb +49 -0
- data/spec/dummy/test/unit/helpers/people_helper_test.rb +4 -0
- data/spec/dummy/test/unit/helpers/sessions_helper_test.rb +4 -0
- data/spec/dummy/test/unit/helpers/users_helper_test.rb +4 -0
- data/spec/dummy/test/unit/person_test.rb +7 -0
- data/spec/dummy/test/unit/user_test.rb +7 -0
- data/spec/dummy/tmp/cache/assets/BC4/870/sprockets%2F64a399278031122c8576726e146081d5 +0 -0
- data/spec/dummy/tmp/cache/assets/C49/710/sprockets%2F8a389a2323475a7053fc419c4103814f +0 -0
- data/spec/dummy/tmp/cache/assets/C9E/F00/sprockets%2Fdbb1755717649d42fe9df99326657618 +0 -0
- data/spec/dummy/tmp/cache/assets/CAA/0C0/sprockets%2Feec4505e23136c45e543a609b0c69554 +0 -0
- data/spec/dummy/tmp/cache/assets/CDE/240/sprockets%2Fcf7da81f64139020d3a4a78f904609c4 +0 -0
- data/spec/dummy/tmp/cache/assets/CEF/560/sprockets%2Fa1bf08ab120c72351b460a65e4800af6 +0 -0
- data/spec/dummy/tmp/cache/assets/CF0/1D0/sprockets%2F6fc757c2c8329244ca95d6909865bbc2 +0 -0
- data/spec/dummy/tmp/cache/assets/D08/D50/sprockets%2F36daa544802ddf93249b8d07dab81125 +0 -0
- data/spec/dummy/tmp/cache/assets/D0A/410/sprockets%2F7e74a40717d2324f9a30ddff29ea5124 +0 -0
- data/spec/dummy/tmp/cache/assets/D0E/C00/sprockets%2F3091a34f307d562f44ee24f4c776baa9 +0 -0
- data/spec/dummy/tmp/cache/assets/D0F/180/sprockets%2F1ea0059d1fca1d25898ff37c7c150944 +0 -0
- data/spec/dummy/tmp/cache/assets/D10/610/sprockets%2F5883b6e94dcea7e32d57de13201563c3 +0 -0
- data/spec/dummy/tmp/cache/assets/D11/D20/sprockets%2Fcac21eac42152981882bf9e489316af4 +0 -0
- data/spec/dummy/tmp/cache/assets/D1F/730/sprockets%2F2f81ed50f6f293b326c576a8528ce9f3 +0 -0
- data/spec/dummy/tmp/cache/assets/D22/380/sprockets%2Fda1670e413fe4633d84eb9394fd7797c +0 -0
- data/spec/dummy/tmp/cache/assets/D32/A10/sprockets%2F13fe41fee1fe35b49d145bcc06610705 +0 -0
- data/spec/dummy/tmp/cache/assets/D33/240/sprockets%2Ffd4446a4ab97006a073ba30d57fdd617 +0 -0
- data/spec/dummy/tmp/cache/assets/D34/140/sprockets%2F0d8b2740eca50a83fc91e51292f9f00c +0 -0
- data/spec/dummy/tmp/cache/assets/D34/680/sprockets%2Fb2cb3891a4cb197ecb1a37299d14c531 +0 -0
- data/spec/dummy/tmp/cache/assets/D3C/3A0/sprockets%2F40c65286b76c2cbc9d2bd92a60e7f126 +0 -0
- data/spec/dummy/tmp/cache/assets/D3D/C40/sprockets%2F4654852579bc0bea406bcd54d38a7dc3 +0 -0
- data/spec/dummy/tmp/cache/assets/D46/650/sprockets%2Ff56253b5f374fff1a33fbbc9881c9124 +0 -0
- data/spec/dummy/tmp/cache/assets/D54/ED0/sprockets%2F71c9fa01091d432b131da3bb73faf3d4 +0 -0
- data/spec/dummy/tmp/cache/assets/D58/1E0/sprockets%2Fdd863e40bd669f77bb549b257d88d6b5 +0 -0
- data/spec/dummy/tmp/cache/assets/D61/6F0/sprockets%2F02da53eeca228bcef0c49278517111fe +0 -0
- data/spec/dummy/tmp/cache/assets/D63/720/sprockets%2Fe625e6b0d13c0bd8ca548a48e1d4508b +0 -0
- data/spec/dummy/tmp/cache/assets/D70/D70/sprockets%2Fc9ac544160bbcc29d775b54ca8f0269f +0 -0
- data/spec/dummy/tmp/cache/assets/D73/220/sprockets%2F3dbc0a37f98fb43ec819b85a64d32c55 +0 -0
- data/spec/dummy/tmp/cache/assets/D7A/BD0/sprockets%2Ff645c87585af5bf4be27a271f20b39ff +0 -0
- data/spec/dummy/tmp/cache/assets/D80/960/sprockets%2F269feebf3271f38b09bd01e9b748f77d +0 -0
- data/spec/dummy/tmp/cache/assets/D82/800/sprockets%2F72f633d76779cbfb7d9a57b5623c3faf +0 -0
- data/spec/dummy/tmp/cache/assets/D84/210/sprockets%2Fabd0103ccec2b428ac62c94e4c40b384 +0 -0
- data/spec/dummy/tmp/cache/assets/D8D/EA0/sprockets%2Fe64949cb167a0aa27a33a1adf1d544be +0 -0
- data/spec/dummy/tmp/cache/assets/DCA/9B0/sprockets%2Fdf0e8f8a85e5d4056b3fe1cec3b7131a +0 -0
- data/spec/dummy/tmp/cache/assets/DF3/BA0/sprockets%2Ffddeae525be5a563ca0d194b614bf64b +0 -0
- data/spec/dummy/tmp/cache/assets/DFF/B40/sprockets%2Fe0d60af9df95b2a58c278acd3f2beb55 +0 -0
- data/spec/dummy/tmp/cache/assets/E04/890/sprockets%2F2f5173deea6c795b8fdde723bb4b63af +0 -0
- data/spec/dummy/tmp/cache/assets/E0A/870/sprockets%2Fbba31cc2875be0fddf5901fef9b99e48 +0 -0
- data/spec/dummy/tmp/cache/assets/E27/590/sprockets%2F097d2347f3f9d2ec19abefaaa5dd0ec1 +0 -0
- data/spec/dummy/tmp/cache/assets/E30/DC0/sprockets%2F9ddd7093ee1d47cbacd526f4bdd36e3c +0 -0
- data/spec/dummy/tmp/cache/assets/E49/530/sprockets%2F10dadda372ee79deb251d7bbbb025cec +0 -0
- data/spec/dummy/tmp/cache/assets/E82/4C0/sprockets%2F0d49c3fa07b559dbecbaabf2a4bad9c8 +0 -0
- data/spec/dummy/tmp/pids/server.pid +1 -0
- data/spec/factories.rb +28 -0
- data/spec/helpers/blogit/application_helper_spec.rb +14 -0
- data/spec/helpers/blogit/posts_helper_spec.rb +34 -0
- data/spec/lib/blogs_spec.rb +23 -0
- data/spec/lib/configuration_spec.rb +57 -0
- data/spec/lib/parsers/html_parser_spec.rb +12 -0
- data/spec/lib/parsers/markdown_parser_spec.rb +12 -0
- data/spec/lib/parsers/textile_parser_spec.rb +12 -0
- data/spec/models/blogit/comment_spec.rb +64 -0
- data/spec/models/blogit/post_spec.rb +153 -0
- data/spec/spec_helper.rb +16 -0
- data/spec/support/authentication.rb +9 -0
- data/spec/support/configuration.rb +5 -0
- metadata +415 -0
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
module Blogit
|
|
2
|
+
class Post < ActiveRecord::Base
|
|
3
|
+
|
|
4
|
+
acts_as_taggable
|
|
5
|
+
|
|
6
|
+
self.table_name = "blog_posts"
|
|
7
|
+
|
|
8
|
+
paginates_per Blogit.configuration.posts_per_page
|
|
9
|
+
|
|
10
|
+
# ===============
|
|
11
|
+
# = Validations =
|
|
12
|
+
# ===============
|
|
13
|
+
|
|
14
|
+
validates :title, presence: true, length: { minimum: 10, maximum: 66 }
|
|
15
|
+
validates :body, presence: true, length: { minimum: 10 }
|
|
16
|
+
validates :blogger_id, presence: true
|
|
17
|
+
|
|
18
|
+
# =================
|
|
19
|
+
# = Assosciations =
|
|
20
|
+
# =================
|
|
21
|
+
|
|
22
|
+
belongs_to :blogger, :polymorphic => true
|
|
23
|
+
|
|
24
|
+
if Blogit.configuration.include_comments
|
|
25
|
+
has_many :comments, :class_name => "Blogit::Comment"
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# ==========
|
|
29
|
+
# = Scopes =
|
|
30
|
+
# ==========
|
|
31
|
+
|
|
32
|
+
# Returns the blog posts paginated for the index page
|
|
33
|
+
# @scope class
|
|
34
|
+
scope :for_index, lambda { |page = 1| order("updated_at DESC").page(page) }
|
|
35
|
+
|
|
36
|
+
# ====================
|
|
37
|
+
# = Instance Methods =
|
|
38
|
+
# ====================
|
|
39
|
+
|
|
40
|
+
def to_param
|
|
41
|
+
"#{id}-#{title.parameterize}"
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# If there's a current blogger and the display name method is set, returns the blogger's display name
|
|
45
|
+
# Otherwise, returns an empty string
|
|
46
|
+
def blogger_display_name
|
|
47
|
+
if self.blogger and !self.blogger.respond_to?(Blogit.configuration.blogger_display_name_method)
|
|
48
|
+
raise ConfigurationError,
|
|
49
|
+
"#{self.blogger.class}##{Blogit.configuration.blogger_display_name_method} is not defined"
|
|
50
|
+
elsif self.blogger.nil?
|
|
51
|
+
""
|
|
52
|
+
else
|
|
53
|
+
self.blogger.send Blogit.configuration.blogger_display_name_method
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
<%= content_tag(:article, id: "blog_comment_#{comment.id}", class: "blog_comment") do %>
|
|
2
|
+
<%= content_tag(:div, class: "blog_comment_name", id: "blog_comment_#{comment.id}_name") do %>
|
|
3
|
+
<%= comment.website? ? link_to(comment.name, comment.website) : comment.name %> wrote:
|
|
4
|
+
<% end %>
|
|
5
|
+
|
|
6
|
+
<%= content_tag(:div, comment.body, class: "blog_comment_body", id: "blog_comment_#{comment.id}_body") %>
|
|
7
|
+
|
|
8
|
+
<%= blog_comment_tag(:footer) do %>
|
|
9
|
+
Posted on <%= time_tag(post.created_at, Blogit.configuration.datetime_format) %>
|
|
10
|
+
<% end %>
|
|
11
|
+
|
|
12
|
+
<%= login_required(class: "actions") do %>
|
|
13
|
+
<%= link_to("delete", [post, comment], method: :delete) %>
|
|
14
|
+
<% end %>
|
|
15
|
+
|
|
16
|
+
<% end %>
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
|
|
2
|
+
<%= form_for [post, comment], remote: true,
|
|
3
|
+
html: {
|
|
4
|
+
class: "new_blog_comment", id: "new_blog_comment" } do |f| -%>
|
|
5
|
+
|
|
6
|
+
<p>Leave a comment</p>
|
|
7
|
+
|
|
8
|
+
<%= field class: "hidden" do %>
|
|
9
|
+
<%= f.label :nickname %>
|
|
10
|
+
<%= f.text_field :nickname %>
|
|
11
|
+
Hide me using CSS
|
|
12
|
+
<% end %>
|
|
13
|
+
|
|
14
|
+
<%= field do %>
|
|
15
|
+
<%= f.label :name, "Name *" %><br>
|
|
16
|
+
<%= f.text_field :name %>
|
|
17
|
+
<%= errors_on(comment, :name) %>
|
|
18
|
+
<% end %>
|
|
19
|
+
|
|
20
|
+
<%= field do %>
|
|
21
|
+
<%= f.label :email, "Email" %> (never displayed)<br>
|
|
22
|
+
<%= f.email_field :email %>
|
|
23
|
+
<%= errors_on(comment, :email) %>
|
|
24
|
+
<% end %>
|
|
25
|
+
|
|
26
|
+
<%= field do %>
|
|
27
|
+
<%= f.label :website, "Your Website" %><br>
|
|
28
|
+
<%= f.url_field :website %>
|
|
29
|
+
<%= errors_on(comment, :website) %>
|
|
30
|
+
<% end %>
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
<%= field do %>
|
|
34
|
+
<%= f.label :body, "Your comment *" %><br>
|
|
35
|
+
<%= f.text_area :body %><br>
|
|
36
|
+
<%= errors_on(comment, :body) %>
|
|
37
|
+
<% end %>
|
|
38
|
+
|
|
39
|
+
<%= actions do %>
|
|
40
|
+
<%= f.submit "Add Comment", :disable_with => 'Adding Comment...' %>
|
|
41
|
+
<% end %>
|
|
42
|
+
<% end -%>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
$("#comment_<%= comment.id %>").remove();
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<hr class="blog_post_spacer">
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
<%= form_for(post, html: {class: "new_blog_post", id: "new_blog_post"}) do |f| %>
|
|
2
|
+
|
|
3
|
+
<% if post.errors.any? %>
|
|
4
|
+
<div id="error_explanation">
|
|
5
|
+
<h2><%= pluralize(post.errors.count, "error") %> prohibited this post from being saved:</h2>
|
|
6
|
+
|
|
7
|
+
<ul>
|
|
8
|
+
<% post.errors.full_messages.each do |msg| %>
|
|
9
|
+
<li><%= msg %></li>
|
|
10
|
+
<% end %>
|
|
11
|
+
</ul>
|
|
12
|
+
</div>
|
|
13
|
+
<% end %>
|
|
14
|
+
|
|
15
|
+
<fieldset>
|
|
16
|
+
<%= field do %>
|
|
17
|
+
<%= f.text_field :title, placeholder: "Give your post a title" %>
|
|
18
|
+
<% end %>
|
|
19
|
+
|
|
20
|
+
<%= field do %>
|
|
21
|
+
<%= f.text_area :body, placeholder: "Write something here..." %>
|
|
22
|
+
<% end %>
|
|
23
|
+
</fieldset>
|
|
24
|
+
|
|
25
|
+
<fieldset>
|
|
26
|
+
|
|
27
|
+
<%= field id: "new_blog_post_tag_field" do %>
|
|
28
|
+
<%= f.label :tag_list, "Tags" %>
|
|
29
|
+
<%= f.text_field :tag_list, placeholder: "tag one, tag two, etc..." %>
|
|
30
|
+
<% end %>
|
|
31
|
+
|
|
32
|
+
<p class="blog_post_tip">
|
|
33
|
+
Tip: you can style your post using <%= blogit_conf.default_parser %>
|
|
34
|
+
</p>
|
|
35
|
+
|
|
36
|
+
</fieldset>
|
|
37
|
+
|
|
38
|
+
<%= actions do %>
|
|
39
|
+
<%= f.submit %> or
|
|
40
|
+
<%= link_to("cancel", post.new_record? ? root_path : post_path(post)) %>
|
|
41
|
+
<% end %>
|
|
42
|
+
|
|
43
|
+
<% end %>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<%= paginate(posts) %>
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
<%= content_tag(:article, id: "blog_post_#{post.id}", class: "blog_post") do %>
|
|
2
|
+
|
|
3
|
+
<%# Render the header for this blog post %>
|
|
4
|
+
<%= render "blogit/posts/post_head", post: post %>
|
|
5
|
+
|
|
6
|
+
<%# Render the body of this blog post (as Markdown) %>
|
|
7
|
+
<%= render "blogit/posts/post_body", post: post %>
|
|
8
|
+
|
|
9
|
+
<%# Render admin links to edit/delete this post %>
|
|
10
|
+
<%= render "blogit/posts/post_links", post: post %>
|
|
11
|
+
|
|
12
|
+
<%# Render info about the person who wrote this post %>
|
|
13
|
+
<%= render "blogit/posts/blogger_information", post: post %>
|
|
14
|
+
|
|
15
|
+
<%# Render the no. of comments %>
|
|
16
|
+
<%= render "blogit/posts/comments_count",
|
|
17
|
+
post: post if defined?(show_comments_count) and show_comments_count %>
|
|
18
|
+
|
|
19
|
+
<% end %>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<%= format_content(post.body) %>
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
<%= login_required do %>
|
|
2
|
+
<%= actions do %>
|
|
3
|
+
<%= link_to("edit", edit_post_path(post)) %> | <%= link_to("delete", post, method: :destroy, confirm: "Are you sure you want to remove this post?") %>
|
|
4
|
+
<% end %>
|
|
5
|
+
<% end unless blogit_conf.author_edits_only and not this_blogger?(post) %>
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
<%= login_required class: "actions", id: "new_blog_post_link" do %>
|
|
2
|
+
<%= link_to 'New Blog post', new_post_path %>
|
|
3
|
+
<% end %>
|
|
4
|
+
|
|
5
|
+
<%= render partial: "blogit/posts/post",
|
|
6
|
+
collection: posts,
|
|
7
|
+
spacer_template: "blog_post_spacer",
|
|
8
|
+
locals: {show_comments_count: true} %>
|
|
9
|
+
|
|
10
|
+
<%= render "pagination" %>
|
data/config/routes.rb
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
class CreateBlogPosts < ActiveRecord::Migration
|
|
2
|
+
def change
|
|
3
|
+
create_table :blog_posts do |t|
|
|
4
|
+
t.string :title, null: false
|
|
5
|
+
t.text :body, null: false
|
|
6
|
+
t.references :blogger, polymorphic: true
|
|
7
|
+
t.integer :comments_count, default: 0, null: false
|
|
8
|
+
t.timestamps
|
|
9
|
+
end
|
|
10
|
+
add_index :blog_posts, [:blogger_type, :blogger_id]
|
|
11
|
+
end
|
|
12
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
class CreateBlogComments < ActiveRecord::Migration
|
|
2
|
+
def change
|
|
3
|
+
create_table :blog_comments do |t|
|
|
4
|
+
t.string :name, null: false
|
|
5
|
+
t.string :email, null: false
|
|
6
|
+
t.string :website
|
|
7
|
+
t.text :body, null: false
|
|
8
|
+
t.references :post, null: false
|
|
9
|
+
t.string :state
|
|
10
|
+
|
|
11
|
+
t.timestamps
|
|
12
|
+
end
|
|
13
|
+
add_index :blog_comments, :post_id
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
class ActsAsTaggableOnMigration < ActiveRecord::Migration
|
|
2
|
+
def self.up
|
|
3
|
+
create_table :tags do |t|
|
|
4
|
+
t.string :name
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
create_table :taggings do |t|
|
|
8
|
+
t.references :tag
|
|
9
|
+
|
|
10
|
+
# You should make sure that the column created is
|
|
11
|
+
# long enough to store the required class names.
|
|
12
|
+
t.references :taggable, :polymorphic => true
|
|
13
|
+
t.references :tagger, :polymorphic => true
|
|
14
|
+
|
|
15
|
+
t.string :context
|
|
16
|
+
|
|
17
|
+
t.datetime :created_at
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
add_index :taggings, :tag_id
|
|
21
|
+
add_index :taggings, [:taggable_id, :taggable_type, :context]
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def self.down
|
|
25
|
+
drop_table :taggings
|
|
26
|
+
drop_table :tags
|
|
27
|
+
end
|
|
28
|
+
end
|
data/lib/blogit.rb
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
require "blogit/configuration"
|
|
2
|
+
require "blogit/blogs"
|
|
3
|
+
require "blogit/engine"
|
|
4
|
+
require "blogit/parsers"
|
|
5
|
+
require "validators"
|
|
6
|
+
|
|
7
|
+
module Blogit
|
|
8
|
+
|
|
9
|
+
# Exception raised when gem may not be configured properly
|
|
10
|
+
class ConfigurationError < StandardError;end
|
|
11
|
+
|
|
12
|
+
# Set global configuration options for Blogit
|
|
13
|
+
# @see README.md
|
|
14
|
+
def self.configure(&block)
|
|
15
|
+
block.call(configuration)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# Returns Blogit's globalconfiguration. Will initialize a new instance
|
|
19
|
+
# if not already set
|
|
20
|
+
def self.configuration
|
|
21
|
+
@configuration ||= Configuration.new
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
end
|
data/lib/blogit/blogs.rb
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
module Blogit
|
|
2
|
+
module Blogs
|
|
3
|
+
|
|
4
|
+
def self.included(base)
|
|
5
|
+
base.extend ClassMethods
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
module ClassMethods
|
|
9
|
+
|
|
10
|
+
# When called within a model (usually User) this creates
|
|
11
|
+
# a has-many assosciation between the model and Blogit::Post
|
|
12
|
+
def blogs
|
|
13
|
+
has_many :blog_posts, :as => "blogger", :class_name => "Blogit::Post"
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
module Blogit
|
|
2
|
+
class Configuration
|
|
3
|
+
|
|
4
|
+
# Should we include comments for blog posts?
|
|
5
|
+
attr_accessor :include_comments
|
|
6
|
+
|
|
7
|
+
# The name of the controller method we'll call to return the current blogger.
|
|
8
|
+
attr_accessor :current_blogger_method
|
|
9
|
+
|
|
10
|
+
# what method do we call on blogger to return their display name?
|
|
11
|
+
# Defaults to :username
|
|
12
|
+
attr_accessor :blogger_display_name_method
|
|
13
|
+
|
|
14
|
+
# Which DateTime::FORMATS format do we use to display
|
|
15
|
+
# blog and comment publish time
|
|
16
|
+
# Defaults to :short
|
|
17
|
+
attr_accessor :datetime_format
|
|
18
|
+
|
|
19
|
+
# Number of posts to show per page
|
|
20
|
+
# @see https://github.com/amatsuda/kaminari
|
|
21
|
+
# @see Blogit::Post
|
|
22
|
+
attr_accessor :posts_per_page
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
# The name of the before filter we'll call to authenticate the current user.
|
|
26
|
+
# Defaults to :login_required
|
|
27
|
+
attr_accessor :authentication_method
|
|
28
|
+
|
|
29
|
+
# If set to true, only the user who authored the post may, edit or destroy.
|
|
30
|
+
# Defaults to false
|
|
31
|
+
# @note This has not been properly implemented yet
|
|
32
|
+
attr_accessor :author_edits_only
|
|
33
|
+
|
|
34
|
+
# If set to true, the comments form will POST and DELETE to the comments
|
|
35
|
+
# controller using AJAX calls.
|
|
36
|
+
# Defaults to true
|
|
37
|
+
attr_accessor :ajax_comments
|
|
38
|
+
|
|
39
|
+
# If set to true, the create, edit, update and destroy actions
|
|
40
|
+
# will be included. If set to false, you'll have to set these
|
|
41
|
+
# yourself elsewhere in the app
|
|
42
|
+
attr_accessor :include_admin_actions
|
|
43
|
+
|
|
44
|
+
# The default format for parsing the blog content.
|
|
45
|
+
# Defaults to :markdown
|
|
46
|
+
attr_accessor :default_parser
|
|
47
|
+
|
|
48
|
+
# When using redcarpet as content parser, pass these options as defaults
|
|
49
|
+
# Defaults to REDCARPET_OPTIONS
|
|
50
|
+
attr_accessor :redcarpet_options
|
|
51
|
+
|
|
52
|
+
REDCARPET_OPTIONS = [:hard_wrap, :filter_html, :autolink,
|
|
53
|
+
:no_intraemphasis, :fenced_code, :gh_blockcode]
|
|
54
|
+
|
|
55
|
+
def initialize
|
|
56
|
+
@include_comments = true
|
|
57
|
+
@current_blogger_method = :current_user
|
|
58
|
+
@blogger_display_name_method = :username
|
|
59
|
+
@datetime_format = :short
|
|
60
|
+
@posts_per_page = 5
|
|
61
|
+
@authentication_method = :login_required
|
|
62
|
+
@author_edits_only = false
|
|
63
|
+
@ajax_comments = true
|
|
64
|
+
@include_admin_actions = true
|
|
65
|
+
@default_parser = :markdown
|
|
66
|
+
@redcarpet_options = REDCARPET_OPTIONS
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def default_parser_class
|
|
70
|
+
"Blogit::Parsers::#{@default_parser.to_s.classify}Parser".constantize
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
end
|
|
74
|
+
end
|