spokes_blog 0.0.2 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6fe259d812ee077303d0c8568d0a53924a821b3e
4
- data.tar.gz: 2f80615157378e1ac24d23f6511fac08291bcb01
3
+ metadata.gz: 6512cf9fc0e532bb2bcda3ef233435ff8341435c
4
+ data.tar.gz: 042c3f97f6342d2c94fec5f9dc488c94b59a6a12
5
5
  SHA512:
6
- metadata.gz: c11e7fcfae26f4703f72477d5966274f90ccc87af915a5e5a610ec68650fe031ea033837196cfb25aed008fd93d1ac4b79a5016abc1e11bd85dfc6212ef868a7
7
- data.tar.gz: 0f1e23c806718d6e84eb4b20d6f082100bfd0fda023ceb1e3700b9028ed88ba2350fb0e713f56b99fc7a91c1c21595c6f082c03f4844580a548a2171ec2ff187
6
+ metadata.gz: 182e4c97fd9107558abe9b2ddb0af5d2cf4fbbfbd25640fe83e8f32450ab47248333b8d8b153501aa339948001f7eee8d67e7083c12d0b9e13d19e851e778d92
7
+ data.tar.gz: a4d4e2b6700204f6a3f6b8b8d8cc147e8f2f6e026c9db8cf64d2e44cd09959934e807fe5a199fc50965fa0650e3f7e39b355ab610e4fe4431eb8c155039d0842
@@ -9,35 +9,40 @@ module SpokesBlog
9
9
  generate "acts_as_taggable_on:migration"
10
10
  end
11
11
 
12
- def generate_files
13
- #models and concerns
12
+ def copy_models_and_concerns
14
13
  copy_file "models/block.rb", "app/models/spokes_blog/block.rb"
15
14
  copy_file "models/post.rb", "app/models/spokes_blog/post.rb"
16
15
  copy_file "models/seo_meta.rb", "app/models/spokes_blog/seo_meta.rb"
17
16
  copy_file "models/concerns/pageable.rb", "app/models/spokes_blog/concerns/pageable.rb"
17
+ end
18
18
 
19
19
 
20
- #controllers
20
+ def copy_controllers
21
21
  copy_file "controllers/admin/posts_controller.rb", "app/controllers/admin/spokes_blog/posts_controller.rb"
22
22
  copy_file "controllers/posts_controller.rb", "app/controllers/spokes_blog/posts_controller.rb"
23
+ end
23
24
 
24
- #admin views
25
+ def copy_admin_views
25
26
  copy_file "views/admin/index.html.haml", "app/views/admin/spokes_blog/posts/index.html.haml"
26
27
  copy_file "views/admin/index.json.jbuilder", "app/views/admin/spokes_blog/posts/index.json.jbuilder"
27
28
  copy_file "views/admin/new.html.haml", "app/views/admin/spokes_blog/posts/new.html.haml"
28
29
  copy_file "views/admin/_form.html.haml", "app/views/admin/spokes_blog/posts/_form.html.haml"
29
30
  copy_file "views/admin/_block_content_form.html.haml", "app/views/admin/spokes_blog/posts/_block_content_form.html.haml"
31
+ copy_file "views/admin/_seo_meta_form.html.haml", "app/views/admin_spokes_blog/posts/_seo_meta_form.html.haml"
32
+ end
30
33
 
31
- #user_views
34
+ def copy_user_views
32
35
  copy_file "views/index.html.haml", "app/views/spokes_blog/posts/index.html.haml"
33
36
  copy_file "views/show.html.haml", "app/views/spokes_blog/posts/show.html.haml"
37
+ end
34
38
 
35
39
 
36
- #presenters
40
+ def copy_presenters
37
41
  copy_file "presenters/presenter.rb", "app/presenters/spokes_blog/presenter.rb"
38
42
  copy_file "presenters/post_presenter.rb", "app/presenters/spokes_blog/post_presenter.rb"
43
+ end
39
44
 
40
- #modify or create user model
45
+ def modify_or_create_user_model
41
46
  if File.exist?(Rails.root.join('app', 'models', 'user.rb')) and
42
47
  File.readlines(Rails.root.join('app', 'models', 'user.rb')).grep(/authored_posts/).size == 0
43
48
  line = "class User < ActiveRecord::Base"
@@ -47,60 +52,67 @@ module SpokesBlog
47
52
  else
48
53
  copy_file "models/user.rb", "app/models/user.rb"
49
54
  end
55
+ end
50
56
 
51
- #modify routes file using default routes
57
+ def add_default_routes
52
58
  if File.readlines(Rails.root.join('config', 'routes.rb')).grep(/spokes_blog/).size == 0
53
59
  line = "::Application.routes.draw do"
54
60
  gsub_file Rails.root.join('config', 'routes.rb'), /(#{Regexp.escape(line)})/mi do |match|
55
61
  %{#{match}
56
- namespace :admin do
57
- scope module: 'spokes_blog' do
58
- resources :posts
59
- end
60
- end
62
+ namespace :admin do
63
+ scope module: 'spokes_blog' do
64
+ resources :posts
65
+ end
66
+ end
61
67
 
62
- scope module: 'spokes_blog' do
63
- resources :posts
64
- end}
68
+ scope module: 'spokes_blog' do
69
+ resources :posts, only: [:index]
70
+ end
71
+ get "/posts/:slug" => "spokes_blog/posts#show", as: :post_slug
72
+ }
65
73
  end
66
74
  end
75
+ end
67
76
 
68
- #modify application.rb ot add models and concerns to load path
77
+ def add_spokes_blog_models_to_load_path
69
78
  if File.readlines(Rails.root.join("config", "application.rb")).grep(/spokes_blog config/).size == 0
70
79
  line = "class Application < Rails::Application"
71
80
  gsub_file Rails.root.join("config", "application.rb"), /(#{Regexp.escape(line)})/mi do |match|
72
81
  %{#{match}
73
- # spokes_blog config
74
- config.autoload_paths += Dir[Rails.root.join('app', 'models', '{**/}')]}
82
+ # spokes_blog config
83
+ config.autoload_paths += Dir[Rails.root.join('app', 'models', '{**/}')]}
75
84
  end
76
85
  end
86
+ end
77
87
 
78
- #add acts-as-taggable-on to gemfile
79
- add_gem_entry_to_gemfile("acts-as-taggable-on")
80
- add_gem_entry_to_gemfile("haml")
81
- add_gem_entry_to_gemfile("kaminari")
88
+ def add_gems_to_gem_file
89
+ %w(acts-as-taggable-on haml kaminari).each do |gem|
90
+ add_gem_entry_to_gemfile(gem)
91
+ end
92
+ end
82
93
 
83
- #migrations for posts and blocks
94
+ def create_migrations
95
+ @migration_count = 10
84
96
  if Dir.glob("db/migrate/*_create_post.rb").empty?
85
- sleep(1)
97
+ #sleep(1)
86
98
  copy_file "migrations/post_migration.rb", "db/migrate/#{migration_timestamp}_create_post.rb"
87
99
  end
88
100
  if Dir.glob("db/migrate/*_create_block.rb").empty?
89
- sleep(1)
101
+ #sleep(1)
90
102
  copy_file "migrations/block_migration.rb", "db/migrate/#{migration_timestamp}_create_block.rb"
91
103
  end
92
104
  if Dir.glob("db/migrate/*_create_seo_meta.rb").empty?
93
- sleep(1)
105
+ #sleep(1)
94
106
  copy_file "migrations/seo_meta_migration.rb", "db/migrate/#{migration_timestamp}_create_seo_meta.rb"
95
107
  end
96
-
97
108
  end
98
109
 
99
110
  private
100
111
 
101
112
  def migration_timestamp
102
113
  migration_number = Time.now.utc.strftime("%Y%m%d%H%M%S").to_i
103
- migration_number += 1
114
+ migration_number += @migration_count
115
+ @migration_count += 1
104
116
  migration_number.to_s
105
117
  end
106
118
 
@@ -47,7 +47,9 @@ class Admin::SpokesBlog::PostsController < ApplicationController
47
47
 
48
48
  def post_params
49
49
  params.require(:spokes_blog_post).permit(:title, :slug, :description, :tag_list,
50
- :author_id, blocks_attributes: [:content, :id])
50
+ :author_id, :state,
51
+ blocks_attributes: [:content, :id],
52
+ seo_meta_attributes: [:browser_title, :meta_description])
51
53
  end
52
54
  end
53
55
 
@@ -1,11 +1,12 @@
1
1
  class SpokesBlog::PostsController < ApplicationController
2
+ around_filter :check_if_record_found, only: :show
2
3
 
3
4
  def index
4
5
  @posts = SpokesBlog::Post.published.page(params[:page]).per(10)
5
6
  end
6
7
 
7
8
  def show
8
- @presenter = post_presenter.single_post(slug: params[:slug])
9
+ @presenter = SpokesBlog::Post.post_presenter.single_post(slug: params[:slug])
9
10
  end
10
11
 
11
12
  private
@@ -13,5 +14,15 @@ class SpokesBlog::PostsController < ApplicationController
13
14
  def post_presenter
14
15
  @post_presenter || @post_presenter = PostPresenter.new
15
16
  end
17
+
18
+ def check_if_record_found
19
+ begin
20
+ yield
21
+ rescue ActiveRecord::RecordNotFound
22
+ #this should be handled in application controller
23
+ raise ActionController::RoutingError.new("Not Found")
24
+ end
25
+ end
26
+
16
27
  end
17
28
 
@@ -26,7 +26,7 @@ module Pageable
26
26
 
27
27
  module ClassMethods
28
28
  def by_slug(slug)
29
- self.find_by(slug: slug)
29
+ self.find_by!(slug: slug)
30
30
  end
31
31
 
32
32
  def by_template(template)
@@ -6,10 +6,13 @@ class SpokesBlog::Post < ActiveRecord::Base
6
6
  belongs_to :created_by, class_name: User
7
7
  belongs_to :author, class_name: User
8
8
  has_many :blocks, class_name: :'SpokesBlog::Block'
9
+ has_one :seo_meta, as: :seo_meta, class_name: :'SpokesBlog::SeoMeta'
9
10
 
10
11
  accepts_nested_attributes_for :blocks,
11
12
  reject_if: lambda { |attrs| attrs['content'].blank? }
12
13
 
14
+ accepts_nested_attributes_for :seo_meta
15
+
13
16
  validates_presence_of :title, :slug
14
17
 
15
18
  validates_format_of :slug, with: /\A[a-zA-Z0-9-]+\z/
@@ -1,4 +1,4 @@
1
- class SeoMeta < ActiveRecord::Base
1
+ class SpokesBlog::SeoMeta < ActiveRecord::Base
2
2
  belongs_to :seo_meta, polymorphic: true
3
3
 
4
4
  end
@@ -1,7 +1,7 @@
1
1
  class SpokesBlog::PostPresenter < Presenter
2
2
 
3
3
  def single_post(params = {})
4
- @post = Post.includes(:author).includes(:blocks).by_slug(params[:slug])
4
+ @post = SpokesBlog::Post.includes(:author).includes(:blocks).includes(:seo_meta).by_slug(params[:slug])
5
5
  self
6
6
  end
7
7
 
@@ -20,5 +20,13 @@ class SpokesBlog::PostPresenter < Presenter
20
20
  def published_at
21
21
  @post.updated_at.strftime("%A, %b %d, %Y")
22
22
  end
23
+
24
+ def browser_title
25
+ @post.seo_meta.browser_title
26
+ end
27
+
28
+ def meta_description
29
+ @post.seo_meta.meta_description
30
+ end
23
31
  end
24
32
 
@@ -1,4 +1,4 @@
1
1
  = f.fields_for :blocks do |block_form|
2
2
  = block_form.label :content
3
- = block_form.text_area
3
+ = block_form.text_area :content
4
4
 
@@ -1,18 +1,25 @@
1
- = form_for [:admin, @post] do |f|
2
- %fieldset
3
- = f.label :title
4
- = f.text_field :title
1
+ %fieldset
2
+ = f.label :title
3
+ = f.text_field :title
5
4
 
6
- = f.label :slug
7
- = f.text_field :slug
5
+ = f.label :slug
6
+ = f.text_field :slug
8
7
 
9
- = f.label :description
10
- = f.text_area :description
8
+ = f.label :description
9
+ = f.text_area :description
11
10
 
12
- = render "block_content_form", { f: f }
11
+ = render "seo_meta_form", { f: f }
13
12
 
14
- = f.label :tags
15
- = f.text_field :tag_list
13
+ = render "block_content_form", { f: f }
16
14
 
17
- = f.submit "Submit"
15
+ = f.label :author_id
16
+ = f.select :author_id, options_from_collection_for_select(User.all.where(role: :admin), "id", "email", current_user.id)
17
+
18
+ = f.label :state
19
+ = f.select :state, options_from_collection_for_select(SpokesBlog::Post::STATES, :last, :first, @post.state)
20
+
21
+ = f.label :tags
22
+ = f.text_field :tag_list
23
+
24
+ = f.submit "Submit"
18
25
 
@@ -0,0 +1,7 @@
1
+ = f.fields_for :seo_meta, @post.seo_meta||SpokesBlog::SeoMeta.new do |meta|
2
+ = meta.label :browser_title
3
+ = meta.text_field :browser_title
4
+
5
+ = meta.label :meta_description
6
+ = meta.text_field :meta_description
7
+
@@ -0,0 +1,2 @@
1
+ = form_for @post, url: admin_post_path(@post) do |f|
2
+ = render "form", { f: f }
@@ -14,12 +14,12 @@
14
14
  $(document).ready(function() {
15
15
  $('.table').dataTable({
16
16
  "bProcessing": true,
17
- "sAjaxSource": "/admin/spokes_blog/posts.json",
17
+ "sAjaxSource": "/admin/posts.json",
18
18
  "sDom": "<'row-fluid'<'span6'l><'span6'f>r>t<'row-fluid'<'span6'i><'span6'p>>",
19
19
  "sPaginationType": "bootstrap"
20
20
  });
21
21
 
22
- $.extend($.fin.dataTableExt.oStdClasses, {
22
+ $.extend($.fn.dataTableExt.oStdClasses, {
23
23
  "sWrapper": "dataTables_wrapper form-inline"
24
24
  });
25
25
  });
@@ -1 +1,2 @@
1
- = render "form"
1
+ = form_for @post, url: admin_posts_path(@post) do |f|
2
+ = render "form", { f: f }
@@ -1,6 +1,6 @@
1
1
  = @presenter.title
2
2
  = @presenter.published_at
3
3
  = @presenter.author
4
- - @presenter.blocks.each do |block|
4
+ - @presenter.content.each do |block|
5
5
  = block.content.html_safe
6
6
 
@@ -1,3 +1,3 @@
1
1
  module SpokesBlog
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.4"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spokes_blog
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matt Obarzanek
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-12-02 00:00:00.000000000 Z
12
+ date: 2013-12-04 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -45,14 +45,14 @@ dependencies:
45
45
  requirements:
46
46
  - - '>='
47
47
  - !ruby/object:Gem::Version
48
- version: '0'
48
+ version: '4.0'
49
49
  type: :development
50
50
  prerelease: false
51
51
  version_requirements: !ruby/object:Gem::Requirement
52
52
  requirements:
53
53
  - - '>='
54
54
  - !ruby/object:Gem::Version
55
- version: '0'
55
+ version: '4.0'
56
56
  - !ruby/object:Gem::Dependency
57
57
  name: acts-as-taggable-on
58
58
  requirement: !ruby/object:Gem::Requirement
@@ -122,7 +122,9 @@ files:
122
122
  - lib/generators/spokes_blog/templates/views/admin/_block_content_form.html.haml
123
123
  - lib/generators/spokes_blog/templates/views/admin/new.html.haml
124
124
  - lib/generators/spokes_blog/templates/views/admin/index.html.haml
125
+ - lib/generators/spokes_blog/templates/views/admin/edit.html.haml
125
126
  - lib/generators/spokes_blog/templates/views/admin/_form.html.haml
127
+ - lib/generators/spokes_blog/templates/views/admin/_seo_meta_form.html.haml
126
128
  - lib/generators/spokes_blog/templates/views/show.html.haml
127
129
  - lib/generators/spokes_blog/templates/views/index.html.haml
128
130
  - lib/generators/spokes_blog/templates/controllers/admin/posts_controller.rb