fuck_comments 2.3.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +30 -0
- data/.ruby-gemset.example +1 -0
- data/.ruby-version.example +1 -0
- data/.rvmrc.example +1 -0
- data/.travis.yml +5 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +338 -0
- data/Rakefile +1 -0
- data/app/assets/javascripts/the_comments.js.coffee +108 -0
- data/app/assets/javascripts/the_comments_manage.js.coffee +27 -0
- data/app/assets/stylesheets/the_comments.css.scss +248 -0
- data/app/controllers/_templates_/comments_controller.rb +44 -0
- data/app/controllers/concerns/the_comments/controller.rb +197 -0
- data/app/controllers/concerns/the_comments/view_token.rb +20 -0
- data/app/helpers/render_comments_tree_helper.rb +111 -0
- data/app/models/_templates_/comment.rb +38 -0
- data/app/models/concerns/the_comments/comment.rb +116 -0
- data/app/models/concerns/the_comments/comment_states.rb +80 -0
- data/app/models/concerns/the_comments/commentable.rb +69 -0
- data/app/models/concerns/the_comments/user.rb +56 -0
- data/app/views/the_comments/_tree.html.erb +3 -0
- data/app/views/the_comments/haml/_additional_info.html.haml +13 -0
- data/app/views/the_comments/haml/_comment.html.haml +1 -0
- data/app/views/the_comments/haml/_comment_body.html.haml +25 -0
- data/app/views/the_comments/haml/_comment_edit.html.haml +26 -0
- data/app/views/the_comments/haml/_form.html.haml +8 -0
- data/app/views/the_comments/haml/_guest_form.html.haml +22 -0
- data/app/views/the_comments/haml/_logined_form.html.haml +18 -0
- data/app/views/the_comments/haml/_manage_controls.html.haml +30 -0
- data/app/views/the_comments/haml/_sidebar.html.haml +9 -0
- data/app/views/the_comments/haml/_sidebar_admin.html.haml +12 -0
- data/app/views/the_comments/haml/_sidebar_backlink.html.haml +3 -0
- data/app/views/the_comments/haml/_sidebar_user.html.haml +29 -0
- data/app/views/the_comments/haml/_tree.html.haml +16 -0
- data/app/views/the_comments/haml/manage.html.haml +26 -0
- data/app/views/the_comments/slim/_additional_info.html.slim +13 -0
- data/app/views/the_comments/slim/_comment.html.slim +1 -0
- data/app/views/the_comments/slim/_comment_body.html.slim +24 -0
- data/app/views/the_comments/slim/_comment_edit.html.slim +26 -0
- data/app/views/the_comments/slim/_form.html.slim +8 -0
- data/app/views/the_comments/slim/_guest_form.html.slim +22 -0
- data/app/views/the_comments/slim/_logined_form.html.slim +18 -0
- data/app/views/the_comments/slim/_manage_controls.html.slim +30 -0
- data/app/views/the_comments/slim/_sidebar.html.slim +9 -0
- data/app/views/the_comments/slim/_sidebar_admin.html.slim +12 -0
- data/app/views/the_comments/slim/_sidebar_backlink.html.slim +3 -0
- data/app/views/the_comments/slim/_sidebar_user.html.slim +29 -0
- data/app/views/the_comments/slim/_tree.html.slim +16 -0
- data/app/views/the_comments/slim/index.html.slim +18 -0
- data/app/views/the_comments/slim/manage.html.slim +26 -0
- data/app/views/the_comments/slim/my_comments.html.slim +28 -0
- data/config/initializers/the_comments.rb +15 -0
- data/config/locales/en.yml +68 -0
- data/config/locales/ru.yml +71 -0
- data/config/routes.rb +38 -0
- data/db/migrate/20130101010101_the_comments_change_user.rb +18 -0
- data/db/migrate/20130101010102_the_comments_create_comments.rb +50 -0
- data/db/migrate/20130101010103_the_comments_change_commentable.rb +13 -0
- data/docs/admin_ui_installation.md +145 -0
- data/docs/advanced_installation.md +185 -0
- data/docs/comment_api.md +58 -0
- data/docs/commentable_api.md +59 -0
- data/docs/config_file.md +27 -0
- data/docs/content_preprocessors.md +73 -0
- data/docs/customazation_of_views.md +30 -0
- data/docs/denormalization_and_recent_comments.md +40 -0
- data/docs/documentation.md +29 -0
- data/docs/generators.md +74 -0
- data/docs/pagination.md +123 -0
- data/docs/routes.md +77 -0
- data/docs/screencast.jpg +0 -0
- data/docs/the_comments.jpg +0 -0
- data/docs/the_comments_view_1.gif +0 -0
- data/docs/the_comments_view_2.gif +0 -0
- data/docs/the_comments_view_3.gif +0 -0
- data/docs/the_comments_view_4.gif +0 -0
- data/docs/the_comments_view_5.gif +0 -0
- data/docs/user_api.md +75 -0
- data/docs/what_is_comcoms.md +63 -0
- data/docs/whats_wrong_with_other_gems.md +28 -0
- data/docs/where_is_example_application.md +37 -0
- data/gem_version.rb +3 -0
- data/lib/generators/the_comments/USAGE +44 -0
- data/lib/generators/the_comments/the_comments_generator.rb +56 -0
- data/lib/generators/the_comments/views_generator.rb +79 -0
- data/lib/the_comments/config.rb +39 -0
- data/lib/the_comments/version.rb +1 -0
- data/lib/the_comments.rb +27 -0
- data/spec/dummy_app/.gitignore +18 -0
- data/spec/dummy_app/.rspec +1 -0
- data/spec/dummy_app/Gemfile +43 -0
- data/spec/dummy_app/README.md +33 -0
- data/spec/dummy_app/Rakefile +6 -0
- data/spec/dummy_app/app/assets/images/.keep +0 -0
- data/spec/dummy_app/app/assets/javascripts/admin_panel.js +5 -0
- data/spec/dummy_app/app/assets/javascripts/application.js +16 -0
- data/spec/dummy_app/app/assets/stylesheets/admin_panel.css +3 -0
- data/spec/dummy_app/app/assets/stylesheets/app.css.scss +4 -0
- data/spec/dummy_app/app/assets/stylesheets/application.css +16 -0
- data/spec/dummy_app/app/controllers/application_controller.rb +7 -0
- data/spec/dummy_app/app/controllers/comments_controller.rb +28 -0
- data/spec/dummy_app/app/controllers/concerns/.keep +0 -0
- data/spec/dummy_app/app/controllers/posts_controller.rb +13 -0
- data/spec/dummy_app/app/controllers/users_controller.rb +7 -0
- data/spec/dummy_app/app/helpers/application_helper.rb +2 -0
- data/spec/dummy_app/app/mailers/.keep +0 -0
- data/spec/dummy_app/app/models/.keep +0 -0
- data/spec/dummy_app/app/models/comment.rb +32 -0
- data/spec/dummy_app/app/models/concerns/.keep +0 -0
- data/spec/dummy_app/app/models/post.rb +17 -0
- data/spec/dummy_app/app/models/user.rb +21 -0
- data/spec/dummy_app/app/views/layouts/admin.html.haml +25 -0
- data/spec/dummy_app/app/views/layouts/application.html.haml +20 -0
- data/spec/dummy_app/app/views/posts/index.html.haml +22 -0
- data/spec/dummy_app/app/views/posts/show.html.haml +7 -0
- data/spec/dummy_app/bin/bundle +3 -0
- data/spec/dummy_app/bin/rails +4 -0
- data/spec/dummy_app/bin/rake +4 -0
- data/spec/dummy_app/config/application.rb +23 -0
- data/spec/dummy_app/config/boot.rb +4 -0
- data/spec/dummy_app/config/database.yml +11 -0
- data/spec/dummy_app/config/environment.rb +5 -0
- data/spec/dummy_app/config/environments/development.rb +29 -0
- data/spec/dummy_app/config/environments/production.rb +80 -0
- data/spec/dummy_app/config/environments/test.rb +36 -0
- data/spec/dummy_app/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy_app/config/initializers/filter_parameter_logging.rb +4 -0
- data/spec/dummy_app/config/initializers/inflections.rb +16 -0
- data/spec/dummy_app/config/initializers/mime_types.rb +5 -0
- data/spec/dummy_app/config/initializers/secret_token.rb +12 -0
- data/spec/dummy_app/config/initializers/session_store.rb +3 -0
- data/spec/dummy_app/config/initializers/sorcery.rb +437 -0
- data/spec/dummy_app/config/initializers/the_comments.rb +15 -0
- data/spec/dummy_app/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy_app/config/locales/en.yml +23 -0
- data/spec/dummy_app/config/routes.rb +19 -0
- data/spec/dummy_app/config.ru +4 -0
- data/spec/dummy_app/db/migrate/20130712061503_sorcery_core.rb +16 -0
- data/spec/dummy_app/db/migrate/20130712065951_create_posts.rb +11 -0
- data/spec/dummy_app/db/migrate/20131027185332_change_user.the_comments_engine.rb +19 -0
- data/spec/dummy_app/db/migrate/20131027185333_create_comments.the_comments_engine.rb +51 -0
- data/spec/dummy_app/db/migrate/20131027185334_change_commentable.the_comments_engine.rb +14 -0
- data/spec/dummy_app/db/schema.rb +74 -0
- data/spec/dummy_app/db/seeds.rb +42 -0
- data/spec/dummy_app/lib/assets/.keep +0 -0
- data/spec/dummy_app/lib/tasks/.keep +0 -0
- data/spec/dummy_app/lib/tasks/app_bootstrap.rake +15 -0
- data/spec/dummy_app/log/.keep +0 -0
- data/spec/dummy_app/public/404.html +58 -0
- data/spec/dummy_app/public/422.html +58 -0
- data/spec/dummy_app/public/500.html +57 -0
- data/spec/dummy_app/public/favicon.ico +0 -0
- data/spec/dummy_app/public/robots.txt +5 -0
- data/spec/dummy_app/spec/factories/post.rb +6 -0
- data/spec/dummy_app/spec/factories/user.rb +6 -0
- data/spec/dummy_app/spec/models/user_counters_spec.rb +339 -0
- data/spec/dummy_app/spec/spec_helper.rb +29 -0
- data/spec/dummy_app/test/controllers/.keep +0 -0
- data/spec/dummy_app/test/fixtures/.keep +0 -0
- data/spec/dummy_app/test/helpers/.keep +0 -0
- data/spec/dummy_app/test/integration/.keep +0 -0
- data/spec/dummy_app/test/mailers/.keep +0 -0
- data/spec/dummy_app/test/models/.keep +0 -0
- data/spec/dummy_app/test/test_helper.rb +15 -0
- data/spec/dummy_app/vendor/assets/javascripts/.keep +0 -0
- data/spec/dummy_app/vendor/assets/stylesheets/.keep +0 -0
- data/the_comments.gemspec +23 -0
- data/views_converter.rb +16 -0
- metadata +332 -0
@@ -0,0 +1,185 @@
|
|
1
|
+
← [documentation](documentation.md)
|
2
|
+
|
3
|
+
## Advanced Installation
|
4
|
+
|
5
|
+
### 1. Gems install
|
6
|
+
|
7
|
+
**Gemfile**
|
8
|
+
|
9
|
+
```ruby
|
10
|
+
gem 'the_comments', "~> 2.0"
|
11
|
+
|
12
|
+
gem 'haml' # or gem 'slim'
|
13
|
+
gem 'awesome_nested_set' # or same gem
|
14
|
+
```
|
15
|
+
|
16
|
+
**Bundle**
|
17
|
+
|
18
|
+
```
|
19
|
+
bundle
|
20
|
+
```
|
21
|
+
|
22
|
+
### 2. Migrations install
|
23
|
+
|
24
|
+
**Copy migrations**
|
25
|
+
|
26
|
+
```
|
27
|
+
rake the_comments_engine:install:migrations
|
28
|
+
```
|
29
|
+
|
30
|
+
Will create:
|
31
|
+
|
32
|
+
* xxxxx_change_user.rb
|
33
|
+
* xxxxx_create_comments.rb
|
34
|
+
* xxxxx_change_commentable.rb
|
35
|
+
|
36
|
+
:warning: **Open and change xxxxx_change_commentable.rb migration**
|
37
|
+
|
38
|
+
```ruby
|
39
|
+
class ChangeCommentable < ActiveRecord::Migration
|
40
|
+
def change
|
41
|
+
# Additional fields to Commentable Models
|
42
|
+
# [:posts, :articles, ... ]
|
43
|
+
|
44
|
+
# There is only Post model is commentable
|
45
|
+
[:posts].each do |table_name|
|
46
|
+
change_table table_name do |t|
|
47
|
+
t.integer :draft_comments_count, default: 0
|
48
|
+
t.integer :published_comments_count, default: 0
|
49
|
+
t.integer :deleted_comments_count, default: 0
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
```
|
55
|
+
|
56
|
+
**Invoke migrations**
|
57
|
+
|
58
|
+
```
|
59
|
+
rake db:migrate
|
60
|
+
```
|
61
|
+
|
62
|
+
### 3. Code install
|
63
|
+
|
64
|
+
```ruby
|
65
|
+
rails g the_comments install
|
66
|
+
```
|
67
|
+
|
68
|
+
Will create:
|
69
|
+
|
70
|
+
* config/initializers/the_comments.rb
|
71
|
+
* app/controllers/comments_controller.rb
|
72
|
+
* app/models/comment.rb
|
73
|
+
|
74
|
+
:warning: **Open each file and follow an instructions**
|
75
|
+
|
76
|
+
### 4. Models modifictions
|
77
|
+
|
78
|
+
**app/models/user.rb**
|
79
|
+
|
80
|
+
```ruby
|
81
|
+
class User < ActiveRecord::Base
|
82
|
+
include TheComments::User
|
83
|
+
|
84
|
+
has_many :posts
|
85
|
+
|
86
|
+
# Your way to define privileged users
|
87
|
+
def admin?
|
88
|
+
self == User.first
|
89
|
+
end
|
90
|
+
|
91
|
+
# Required TheComments methods for users restrictions
|
92
|
+
def comments_admin?
|
93
|
+
admin?
|
94
|
+
end
|
95
|
+
|
96
|
+
def comments_moderator? comment
|
97
|
+
id == comment.holder_id
|
98
|
+
end
|
99
|
+
end
|
100
|
+
```
|
101
|
+
|
102
|
+
**app/models/post.rb**
|
103
|
+
|
104
|
+
```ruby
|
105
|
+
class Post < ActiveRecord::Base
|
106
|
+
include TheComments::Commentable
|
107
|
+
|
108
|
+
belongs_to :user
|
109
|
+
|
110
|
+
# Denormalization methods
|
111
|
+
# Migration: t.string :title
|
112
|
+
# => "My new awesome post"
|
113
|
+
def commentable_title
|
114
|
+
try(:title) || "Undefined post title"
|
115
|
+
end
|
116
|
+
|
117
|
+
# => your way to build URL
|
118
|
+
# => "/posts/254"
|
119
|
+
def commentable_url
|
120
|
+
['', self.class.to_s.tableize, id].join('/')
|
121
|
+
end
|
122
|
+
|
123
|
+
# gem 'state_machine'
|
124
|
+
# Migration: t.string :state
|
125
|
+
# => "published" | "draft" | "deleted"
|
126
|
+
def commentable_state
|
127
|
+
try(:state) || "published"
|
128
|
+
end
|
129
|
+
end
|
130
|
+
```
|
131
|
+
|
132
|
+
### 5. Mount Engine routes
|
133
|
+
|
134
|
+
**config/routes.rb**
|
135
|
+
|
136
|
+
```ruby
|
137
|
+
MyApp::Application.routes.draw do
|
138
|
+
root 'posts#index'
|
139
|
+
resources :posts
|
140
|
+
|
141
|
+
# ...
|
142
|
+
|
143
|
+
# TheComments routes
|
144
|
+
concern :user_comments, TheComments::UserRoutes.new
|
145
|
+
concern :admin_comments, TheComments::AdminRoutes.new
|
146
|
+
resources :comments, concerns: [:user_comments, :admin_comments]
|
147
|
+
end
|
148
|
+
```
|
149
|
+
|
150
|
+
Please, read [documentation](docs/documentation.md) to learn more
|
151
|
+
|
152
|
+
### 6. Assets install
|
153
|
+
|
154
|
+
**app/assets/stylesheets/application.css**
|
155
|
+
|
156
|
+
```css
|
157
|
+
/*
|
158
|
+
*= require the_comments
|
159
|
+
*/
|
160
|
+
```
|
161
|
+
|
162
|
+
**app/assets/javascripts/application.js**
|
163
|
+
|
164
|
+
```js
|
165
|
+
//= require the_comments
|
166
|
+
```
|
167
|
+
|
168
|
+
### 7. Controller code example
|
169
|
+
|
170
|
+
**app/controllers/posts_controllers.rb**
|
171
|
+
|
172
|
+
```ruby
|
173
|
+
def show
|
174
|
+
@post = Post.find params[:id]
|
175
|
+
@comments = @post.comments.with_state([:draft, :published])
|
176
|
+
end
|
177
|
+
```
|
178
|
+
|
179
|
+
### 8. View code example
|
180
|
+
|
181
|
+
**app/views/posts/show.html.haml**
|
182
|
+
|
183
|
+
```haml
|
184
|
+
= render partial: 'the_comments/tree', locals: { commentable: @post, comments_tree: @comments }
|
185
|
+
```
|
data/docs/comment_api.md
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
← [documentation](documentation.md)
|
2
|
+
|
3
|
+
### Comment API
|
4
|
+
|
5
|
+
```ruby
|
6
|
+
@comment = Comment.last
|
7
|
+
|
8
|
+
# Comment creator, can be nil (for Guest)
|
9
|
+
@comment.user # => User
|
10
|
+
|
11
|
+
# Comment holder
|
12
|
+
# Owner of commentable object
|
13
|
+
# shouldn't be nil, should be defined on create
|
14
|
+
@comment.holder # => User
|
15
|
+
|
16
|
+
# Commentable object
|
17
|
+
@comment.commentable # => Post
|
18
|
+
|
19
|
+
# Raw user input
|
20
|
+
@comment.raw_content
|
21
|
+
|
22
|
+
# Processed user input
|
23
|
+
# method *prepare_content* should be redefined by developer
|
24
|
+
@comment.content
|
25
|
+
|
26
|
+
# Denormalization fields
|
27
|
+
@comment.commentable_title # => "Harum sint error odit."
|
28
|
+
@comment.commentable_url # => "/posts/7"
|
29
|
+
@comment.commentable_state # => "published"
|
30
|
+
|
31
|
+
# Stat info from request
|
32
|
+
# Can be used for spam detection
|
33
|
+
@comment.user_agent # => Opera/9.80 (Windows NT 5.1; U; en) Presto/2.2.15 Version/10.10
|
34
|
+
@comment.tolerance_time # => 5 (secs)
|
35
|
+
@comment.referer # => localhost:3000/post/7
|
36
|
+
@comment.ip # => 192.168.0.12
|
37
|
+
|
38
|
+
# State
|
39
|
+
@comment.state # => draft | published | deleted
|
40
|
+
|
41
|
+
# Spam flag
|
42
|
+
@comment.spam # => true
|
43
|
+
|
44
|
+
# Alias for *mark_as_spam*
|
45
|
+
@comment.to_spam
|
46
|
+
|
47
|
+
# mark this comment and all descendants as spam/not spam
|
48
|
+
@comment.mark_as_spam
|
49
|
+
@comment.mark_as_not_spam
|
50
|
+
|
51
|
+
# Comment's creator avatar
|
52
|
+
# this method can be redefined by developer
|
53
|
+
@comment.avatar_url # => "https://2.gravatar.com/avatar/015e ... 2f05?s=42&d=https://identicons.github.com/AVATAR.png"
|
54
|
+
|
55
|
+
# Anchor of comment
|
56
|
+
# this method can be redefined by developer
|
57
|
+
@comment.anchor # => b58020
|
58
|
+
```
|
@@ -0,0 +1,59 @@
|
|
1
|
+
← [documentation](documentation.md)
|
2
|
+
|
3
|
+
### Commentable API
|
4
|
+
|
5
|
+
```ruby
|
6
|
+
class Post < ActiveRecord::Base
|
7
|
+
include TheCommentsCommentable
|
8
|
+
|
9
|
+
belongs_to :user
|
10
|
+
|
11
|
+
def commentable_title
|
12
|
+
try(:title) || "Undefined title"
|
13
|
+
end
|
14
|
+
|
15
|
+
def commentable_url
|
16
|
+
['', self.class.to_s.tableize, id].join('/')
|
17
|
+
end
|
18
|
+
|
19
|
+
def commentable_state
|
20
|
+
try(:state) || "published"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
```
|
24
|
+
|
25
|
+
```ruby
|
26
|
+
@post = Post.last
|
27
|
+
|
28
|
+
# Post owner
|
29
|
+
@post.user # => User
|
30
|
+
|
31
|
+
# All comments for commentable object
|
32
|
+
@post.comments # => ActiveRecord:Collection
|
33
|
+
|
34
|
+
# Cache counters
|
35
|
+
@post.draft_comments_count # => 1
|
36
|
+
@post.published_comments_count # => 2
|
37
|
+
@post.deleted_comments_count # => 0
|
38
|
+
|
39
|
+
# equal values with direct request to database
|
40
|
+
@post.comments.with_state([:draft]).count # => 1
|
41
|
+
@post.comments.with_state([:published]).count # => 2
|
42
|
+
@post.comments.with_state([:deleted]).count # => 0
|
43
|
+
|
44
|
+
# Alias for:
|
45
|
+
# draft_comments_count + published_comments_count
|
46
|
+
@post.comments_sum # => 3
|
47
|
+
|
48
|
+
# Spam comments
|
49
|
+
@post.comments.where(spam: true) # => ActiveRecord::Relation
|
50
|
+
|
51
|
+
# recalculate cache counters
|
52
|
+
@post.recalculate_comments_counters!
|
53
|
+
|
54
|
+
# Default Denormalization methods
|
55
|
+
# should be redefined by developer
|
56
|
+
@post.commentable_title => "Maiores eos rerum numquam aut."
|
57
|
+
@post.commentable_url => "/posts/9"
|
58
|
+
@post.commentable_state => "published"
|
59
|
+
```
|
data/docs/config_file.md
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
← [documentation](documentation.md)
|
2
|
+
|
3
|
+
### TheComments config
|
4
|
+
|
5
|
+
Following rails generator will copy default config file into your application
|
6
|
+
|
7
|
+
```ruby
|
8
|
+
bundle exec rails g the_comments config
|
9
|
+
```
|
10
|
+
|
11
|
+
**config/initializers/the_comments.rb**
|
12
|
+
|
13
|
+
```ruby
|
14
|
+
# TheComments.config.param_name => value
|
15
|
+
|
16
|
+
TheComments.configure do |config|
|
17
|
+
config.max_reply_depth = 3 # comments tree depth
|
18
|
+
config.tolerance_time = 5 # sec - after this delay user can post a comment
|
19
|
+
config.default_state = :draft # default state for comment
|
20
|
+
config.default_owner_state = :published # default state for comment for Moderator
|
21
|
+
config.empty_inputs = [:commentBody] # array of spam trap fields
|
22
|
+
config.default_title = 'Undefined title' # default commentable_title for denormalization
|
23
|
+
|
24
|
+
config.empty_trap_protection = true
|
25
|
+
config.tolerance_time_protection = true
|
26
|
+
end
|
27
|
+
```
|
@@ -0,0 +1,73 @@
|
|
1
|
+
← [documentation](documentation.md)
|
2
|
+
|
3
|
+
### Text preprocessors
|
4
|
+
|
5
|
+
TheComments designed for using with text preprocessors: Textile, Markdown, Sanitize, Coderay etc.
|
6
|
+
|
7
|
+
That is why Comment model has 2 fields for user input: **raw_content** and **content**
|
8
|
+
|
9
|
+
```ruby
|
10
|
+
class CreateComments < ActiveRecord::Migration
|
11
|
+
def change
|
12
|
+
create_table :comments do |t|
|
13
|
+
# ...
|
14
|
+
|
15
|
+
t.text :raw_content
|
16
|
+
t.text :content
|
17
|
+
|
18
|
+
# ...
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
```
|
23
|
+
|
24
|
+
**raw_content** - field with original user's input
|
25
|
+
|
26
|
+
**content** - field with processed user's input
|
27
|
+
|
28
|
+
<hr>
|
29
|
+
|
30
|
+
**before_save :prepare_content** - provides processing of raw user's input
|
31
|
+
|
32
|
+
By default **prepare_content** looks like this:
|
33
|
+
|
34
|
+
```ruby
|
35
|
+
def prepare_content
|
36
|
+
self.content = self.raw_content
|
37
|
+
end
|
38
|
+
```
|
39
|
+
|
40
|
+
I think every developer should redefine this behaviour. To do this you should to use following instructions.
|
41
|
+
|
42
|
+
### Comment Model customization
|
43
|
+
|
44
|
+
invoke TheComments generator
|
45
|
+
|
46
|
+
```ruby
|
47
|
+
bundle exec rails g the_comments models
|
48
|
+
```
|
49
|
+
|
50
|
+
This will create **app/models/comment.rb**
|
51
|
+
|
52
|
+
```ruby
|
53
|
+
class Comment < ActiveRecord::Base
|
54
|
+
include TheCommentsBase
|
55
|
+
|
56
|
+
# ---------------------------------------------------
|
57
|
+
# Define your filters for content
|
58
|
+
# Expample for: gem 'RedCloth', gem 'sanitize'
|
59
|
+
# your personal SmilesProcessor
|
60
|
+
|
61
|
+
# def prepare_content
|
62
|
+
# text = self.raw_content
|
63
|
+
# text = RedCloth.new(text).to_html
|
64
|
+
# text = SmilesProcessor.new(text)
|
65
|
+
# text = Sanitize.clean(text, Sanitize::Config::RELAXED)
|
66
|
+
# self.content = text
|
67
|
+
# end
|
68
|
+
# ---------------------------------------------------
|
69
|
+
end
|
70
|
+
```
|
71
|
+
|
72
|
+
Just redefine **prepare_content** for your purposes
|
73
|
+
|
@@ -0,0 +1,30 @@
|
|
1
|
+
← [documentation](documentation.md)
|
2
|
+
|
3
|
+
## Customization
|
4
|
+
|
5
|
+
You can use **rails generators** for copy files into your Application. After that you can customize almost everything
|
6
|
+
|
7
|
+
Generators list:
|
8
|
+
|
9
|
+
```ruby
|
10
|
+
bundle exec rails g the_comments --help
|
11
|
+
```
|
12
|
+
|
13
|
+
### Customization of views
|
14
|
+
|
15
|
+
Copy View files for customization:
|
16
|
+
|
17
|
+
```ruby
|
18
|
+
bundle exec rails g the_comments:views assets
|
19
|
+
bundle exec rails g the_comments:views views
|
20
|
+
```
|
21
|
+
|
22
|
+
### Customization of comments tree
|
23
|
+
|
24
|
+
Copy Helper file for tree customization:
|
25
|
+
|
26
|
+
```ruby
|
27
|
+
bundle exec rails g the_comments:views helper
|
28
|
+
```
|
29
|
+
|
30
|
+
For more info read [TheSortableTree doc](https://github.com/the-teacher/the_sortable_tree)
|
@@ -0,0 +1,40 @@
|
|
1
|
+
← [documentation](documentation.md)
|
2
|
+
|
3
|
+
## Denormalization
|
4
|
+
|
5
|
+
For building of Recent comments list (for polymorphic relationship) we need to have many additional requests to database. It's classic problem of polymorphic comments.
|
6
|
+
|
7
|
+
I use denormalization of commentable objects to solve this problem.
|
8
|
+
|
9
|
+
My practice shows - We need 3 denormalized fields into comment for (request-free) building of recent comments list:
|
10
|
+
|
11
|
+
<img src="https://raw.github.com/the-teacher/the_comments/master/docs/the_comments_view_5.gif" alt="the_comments">
|
12
|
+
|
13
|
+
* **Comment#commentable_title** - for example: "My first post about Ruby On Rails"
|
14
|
+
* **Comment#commentable_url** - for example: "/posts/1-my-first-post-about-ruby-on-rails"
|
15
|
+
* **Comment#commentable_state** - for example: "draft"
|
16
|
+
|
17
|
+
That is why any **Commentable Model should have few methods** to provide denormalization for Comments.
|
18
|
+
|
19
|
+
## Recent comments building
|
20
|
+
|
21
|
+
Denormalization makes building of Recent comments (for polymorphic relationship) very easy!
|
22
|
+
|
23
|
+
Controller:
|
24
|
+
|
25
|
+
```ruby
|
26
|
+
@comments = Comment.with_state(:published)
|
27
|
+
.where(commentable_state: [:published])
|
28
|
+
.order('created_at DESC')
|
29
|
+
.page(params[:page])
|
30
|
+
```
|
31
|
+
|
32
|
+
View:
|
33
|
+
|
34
|
+
```ruby
|
35
|
+
- @comments.each do |comment|
|
36
|
+
%div
|
37
|
+
%p= comment.commentable_title
|
38
|
+
%p= link_to comment.commentable_title, comment.commentable_url
|
39
|
+
%p= comment.content
|
40
|
+
```
|