bbs 0.1.0 → 1.0.0
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.
- checksums.yaml +4 -4
- data/README.md +68 -5
- data/app/assets/stylesheets/bbs/_article.css.sass +20 -0
- data/app/assets/stylesheets/bbs/_bbs-list.css.sass +3 -0
- data/app/assets/stylesheets/bbs/_button.css.sass +2 -0
- data/app/assets/stylesheets/bbs/_form.css.sass +16 -0
- data/app/assets/stylesheets/bbs/_new-topic.css.sass +6 -0
- data/app/assets/stylesheets/bbs/application.css +0 -11
- data/app/cells/bbs/application_cell.rb +12 -3
- data/app/cells/bbs/article/show.haml +14 -0
- data/app/cells/bbs/article_cell.rb +26 -0
- data/app/cells/bbs/category/show.haml +6 -4
- data/app/cells/bbs/latest_topics/show.haml +5 -4
- data/app/cells/bbs/latest_topics_cell.rb +1 -1
- data/app/controllers/bbs/application_controller.rb +7 -1
- data/app/controllers/bbs/comments_controller.rb +23 -2
- data/app/controllers/bbs/concerns/authenticatable.rb +21 -0
- data/app/controllers/bbs/profiles_controller.rb +35 -0
- data/app/controllers/bbs/topics_controller.rb +22 -2
- data/app/models/bbs/application_record.rb +4 -0
- data/app/models/bbs/avatar.rb +9 -0
- data/app/models/bbs/category.rb +2 -2
- data/app/models/bbs/comment.rb +5 -2
- data/app/models/bbs/topic.rb +6 -3
- data/app/models/bbs/user.rb +10 -0
- data/app/models/bbs/user_profile.rb +8 -0
- data/app/views/bbs/comments/index.html.haml +17 -8
- data/app/views/bbs/profiles/edit.html.haml +12 -0
- data/app/views/bbs/shared/_comment_form.html.haml +10 -0
- data/app/views/bbs/topics/index.html.haml +19 -4
- data/app/views/bbs/topics/new.html.haml +16 -0
- data/config/breadcrumbs.rb +13 -0
- data/config/locales/bbs.en.yml +56 -0
- data/config/locales/bbs.ja.yml +56 -0
- data/config/routes.rb +2 -0
- data/db/migrate/20160817082220_add_author_id.rb +6 -0
- data/db/migrate/20160902071411_create_bbs_users.rb +8 -0
- data/db/migrate/20160902071450_create_bbs_user_profiles.rb +13 -0
- data/db/migrate/20160928082713_create_bbs_avatars.rb +9 -0
- data/db/migrate/20160930093905_add_avatar_id_to_user.rb +7 -0
- data/db/migrate/20161028081055_rename_avatar_column.rb +8 -0
- data/lib/bbs.rb +13 -2
- data/lib/bbs/configuration.rb +35 -0
- data/lib/bbs/engine.rb +11 -0
- data/lib/bbs/version.rb +1 -1
- data/lib/generators/bbs/config_generator.rb +32 -0
- data/lib/generators/bbs/templates/bbs.rb +26 -0
- data/lib/generators/bbs/views_generator.rb +15 -0
- metadata +130 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 090859437ceb4d0c72eba0956b05e6830057579e
|
4
|
+
data.tar.gz: 8cf36a74c50266e44496bbbef76ff25ebf79c4e1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 46fd87f5a2664447715423efe71d12771a687ac90f51da86294dfcad2fc2ca7cf5f74d6cb488bd327540cad504d6b5075508caf738432e3eecb528ef3cb79198
|
7
|
+
data.tar.gz: c11d6e7003edd66d725398be23e6380c5ae313d0778fa5d3ed5b3883bfe79f2f4dbb43c0a04da913a242b932ca91b46367180e0d43b85532c553bb228895c581
|
data/README.md
CHANGED
@@ -1,8 +1,5 @@
|
|
1
1
|
# Bbs
|
2
|
-
|
3
|
-
|
4
|
-
## Usage
|
5
|
-
How to use my plugin.
|
2
|
+
A Rails Engine for BBS(Bulletin Board System).
|
6
3
|
|
7
4
|
## Installation
|
8
5
|
Add this line to your application's Gemfile:
|
@@ -21,8 +18,74 @@ Or install it yourself as:
|
|
21
18
|
$ gem install bbs
|
22
19
|
```
|
23
20
|
|
21
|
+
## Getting started
|
22
|
+
### copy migrations
|
23
|
+
|
24
|
+
```bash
|
25
|
+
$ bin/rails bbs:install:migrations
|
26
|
+
```
|
27
|
+
|
28
|
+
### Mount
|
29
|
+
|
30
|
+
Edit `config/routes.rb`:
|
31
|
+
|
32
|
+
```ruby
|
33
|
+
Rails.application.routes.draw do
|
34
|
+
mount Bbs::Engnie => '/bbs' # choose your mount point arbitrarylly
|
35
|
+
end
|
36
|
+
```
|
37
|
+
|
38
|
+
### Copy configurations to your application
|
39
|
+
|
40
|
+
```bash
|
41
|
+
$ bin/rails g bbs:config
|
42
|
+
```
|
43
|
+
|
44
|
+
Execute the above command will copy following files into your
|
45
|
+
`config/initializers`.
|
46
|
+
|
47
|
+
* config/initializers/bbs.rb
|
48
|
+
* config/locales/bbs.ja.yml
|
49
|
+
* config/locales/bbs.en.yml
|
50
|
+
|
51
|
+
## View Components
|
52
|
+
### List categories
|
53
|
+
|
54
|
+
Component that list all categories.
|
55
|
+
In view, you have to call the cell object:
|
56
|
+
|
57
|
+
```haml
|
58
|
+
= cell('bbs/category')
|
59
|
+
```
|
60
|
+
|
61
|
+
### List latest topics
|
62
|
+
|
63
|
+
Component that list latest topics.
|
64
|
+
In view, you have to call the cell object:
|
65
|
+
```haml
|
66
|
+
= cell('bbs/latest_topics')
|
67
|
+
```
|
68
|
+
To change the number of displayed topics, change the value `config.latest_topics_count` in `config/initializers/bbs.rb` (The default is 10).
|
69
|
+
|
70
|
+
## Customization
|
71
|
+
### Copy views to your application
|
72
|
+
|
73
|
+
If you want to customize bbs views, you can copy view templates provided by this
|
74
|
+
gem using generator.
|
75
|
+
|
76
|
+
```bash
|
77
|
+
$ bin/rails g bbs:views
|
78
|
+
```
|
79
|
+
|
80
|
+
Execute the above command will copy view templates to `app/views/bbs/`.
|
81
|
+
|
82
|
+
|
24
83
|
## Contributing
|
25
|
-
|
84
|
+
1. Fork it ( http://github.com/bm-sms/bbs )
|
85
|
+
2. Create your feature branch (git checkout -b my-new-feature)
|
86
|
+
3. Commit your changes (git commit -am 'Add some feature')
|
87
|
+
4. Push to the branch (git push origin my-new-feature)
|
88
|
+
5. Create new Pull Request
|
26
89
|
|
27
90
|
## License
|
28
91
|
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|
@@ -0,0 +1,20 @@
|
|
1
|
+
.bbs-avatar
|
2
|
+
img
|
3
|
+
width: 48px
|
4
|
+
height: 48px
|
5
|
+
|
6
|
+
.bbs-article
|
7
|
+
&__body
|
8
|
+
margin-top: 15px
|
9
|
+
white-space: pre-line
|
10
|
+
|
11
|
+
&__posted-at
|
12
|
+
margin: auto
|
13
|
+
margin-right: 0
|
14
|
+
|
15
|
+
&__title
|
16
|
+
font-size: 2rem
|
17
|
+
|
18
|
+
.bbs-article-creation
|
19
|
+
display: flex
|
20
|
+
align-items: center
|
@@ -1,15 +1,4 @@
|
|
1
1
|
/*
|
2
|
-
* This is a manifest file that'll be compiled into application.css, which will include all the files
|
3
|
-
* listed below.
|
4
|
-
*
|
5
|
-
* Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
|
6
|
-
* or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path.
|
7
|
-
*
|
8
|
-
* You're free to add application-wide styles to this file and they'll appear at the bottom of the
|
9
|
-
* compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS
|
10
|
-
* files in this directory. Styles in this file should be added after the last require_* statement.
|
11
|
-
* It is generally better to create a new file per style scope.
|
12
|
-
*
|
13
2
|
*= require_tree .
|
14
3
|
*= require_self
|
15
4
|
*/
|
@@ -1,10 +1,19 @@
|
|
1
1
|
module Bbs
|
2
2
|
class ApplicationCell < Cell::ViewModel
|
3
|
-
include
|
3
|
+
include ActionView::Helpers::FormHelper
|
4
|
+
include ActionView::Helpers::FormOptionsHelper
|
5
|
+
include ActionView::Helpers::TranslationHelper
|
4
6
|
include ActionView::Helpers::UrlHelper
|
5
|
-
|
6
|
-
|
7
|
+
include ActionView::RecordIdentifier
|
8
|
+
include Cell::Hamlit
|
9
|
+
include Cell::Translation
|
7
10
|
|
8
11
|
self.view_paths = [Bbs::Engine.root.join('app/cells').to_s]
|
12
|
+
|
13
|
+
def method_missing(method, *args, &block)
|
14
|
+
super and return unless parent_controller.respond_to?(method)
|
15
|
+
|
16
|
+
parent_controller.__send__ method, *args, &block
|
17
|
+
end
|
9
18
|
end
|
10
19
|
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
%article.bbs-article
|
2
|
+
%header.bbs-article__header
|
3
|
+
%h1.bbs-article__title= sanitize(title)
|
4
|
+
|
5
|
+
.bbs-article-container
|
6
|
+
.bbs-article-creation
|
7
|
+
%span.bbs-avatar
|
8
|
+
%img(src="#{avatar_url}")
|
9
|
+
|
10
|
+
%span.bbs-article__author-name= sanitize(nickname)
|
11
|
+
|
12
|
+
%time.bbs-article__posted-at= l(created_at)
|
13
|
+
|
14
|
+
%p.bbs-article__body= sanitize(article_body)
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Bbs
|
2
|
+
class ArticleCell < ApplicationCell
|
3
|
+
property :author
|
4
|
+
property :title
|
5
|
+
property :body
|
6
|
+
property :created_at
|
7
|
+
|
8
|
+
def show
|
9
|
+
render
|
10
|
+
end
|
11
|
+
|
12
|
+
def article_body
|
13
|
+
return body if logged_in? || !Bbs.config.clamp_article_body
|
14
|
+
|
15
|
+
body.truncate([body.truncate_words(1).length, Bbs.config.clamp_article_body].min)
|
16
|
+
end
|
17
|
+
|
18
|
+
def nickname
|
19
|
+
author.profile.nickname
|
20
|
+
end
|
21
|
+
|
22
|
+
def avatar_url
|
23
|
+
author.profile.avatar.image.url(:medium)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -1,5 +1,7 @@
|
|
1
|
-
%
|
1
|
+
%article.bbs-categories
|
2
|
+
%h1.bbs-categories__title= t('.title')
|
2
3
|
|
3
|
-
%ol.bbs-category
|
4
|
-
|
5
|
-
|
4
|
+
%ol.bbs-category-list
|
5
|
+
- @categories.each do |category|
|
6
|
+
%li.bbs-category-item{data: {category: "#{category.name}"}}
|
7
|
+
= link_to category.name, bbs.category_topics_path(category)
|
@@ -1,5 +1,6 @@
|
|
1
|
-
%
|
1
|
+
%article.latest-topics
|
2
|
+
%h1= t('.title')
|
2
3
|
|
3
|
-
%ol
|
4
|
-
|
5
|
-
|
4
|
+
%ol.latest-topic-list
|
5
|
+
- @topics.each do |topic|
|
6
|
+
%li.latest-topic-item= link_to sanitize(topic.title), bbs.topic_comments_path(topic)
|
@@ -1,7 +1,13 @@
|
|
1
1
|
module Bbs
|
2
|
-
class ApplicationController <
|
2
|
+
class ApplicationController < ::ApplicationController
|
3
|
+
include Bbs::Concerns::Authenticatable
|
4
|
+
|
3
5
|
protect_from_forgery with: :exception
|
4
6
|
|
5
7
|
layout 'layouts/application'
|
8
|
+
|
9
|
+
def logged_in?; current_user end
|
10
|
+
|
11
|
+
helper_method :logged_in?
|
6
12
|
end
|
7
13
|
end
|
@@ -1,9 +1,21 @@
|
|
1
1
|
module Bbs
|
2
|
-
class CommentsController < ApplicationController
|
2
|
+
class CommentsController < Bbs::ApplicationController
|
3
|
+
before_action :authenticate_user!, only: %i(create)
|
3
4
|
before_action :set_topic
|
4
5
|
|
6
|
+
def create
|
7
|
+
@comment = @topic.comments.build(comment_params)
|
8
|
+
|
9
|
+
if @comment.save
|
10
|
+
redirect_to bbs.topic_comments_path(@topic), notice: t('.success')
|
11
|
+
else
|
12
|
+
redirect_back fallback_location: bbs.topic_comments_path(@topic), alert: @comment.errors.full_messages
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
5
16
|
def index
|
6
|
-
@
|
17
|
+
@comment = @topic.comments.build
|
18
|
+
@comments = comments
|
7
19
|
end
|
8
20
|
|
9
21
|
private
|
@@ -11,5 +23,14 @@ module Bbs
|
|
11
23
|
def set_topic
|
12
24
|
@topic = Bbs::Topic.find(params[:topic_id])
|
13
25
|
end
|
26
|
+
|
27
|
+
def comment_params
|
28
|
+
params.require(:comment).permit(Bbs::Comment.permitted_attributes)
|
29
|
+
.merge(author: current_user)
|
30
|
+
end
|
31
|
+
|
32
|
+
def comments
|
33
|
+
@topic.comments.order(:updated_at).page(params[:page]).per(Bbs.config.comments_per_page)
|
34
|
+
end
|
14
35
|
end
|
15
36
|
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Bbs
|
2
|
+
module Concerns
|
3
|
+
module Authenticatable
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
included do
|
7
|
+
unless public_instance_methods.include?(Bbs.config.current_user)
|
8
|
+
define_method(:current_user) do
|
9
|
+
__send__ Bbs.config.current_user
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
unless public_instance_methods.include?(Bbs.config.authenticate_user)
|
14
|
+
define_method(:authenticate_user!) do
|
15
|
+
__send__ Bbs.config.authenticate_user
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Bbs
|
2
|
+
class ProfilesController < Bbs::ApplicationController
|
3
|
+
before_action :authenticate_user!
|
4
|
+
|
5
|
+
def edit
|
6
|
+
current_user.build_profile unless current_user.profile
|
7
|
+
end
|
8
|
+
|
9
|
+
def create
|
10
|
+
if current_user.create_profile(profile_params)
|
11
|
+
redirect_to edit_profile_path, notice: t('.success')
|
12
|
+
else
|
13
|
+
flash.now[:alert] = current_user.profile.errors.full_messages
|
14
|
+
|
15
|
+
render :edit
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def update
|
20
|
+
if current_user.profile.update(profile_params)
|
21
|
+
redirect_to edit_profile_path, notice: t('.success')
|
22
|
+
else
|
23
|
+
flash.now[:alert] = current_user.profile.errors.full_messages
|
24
|
+
|
25
|
+
render :edit
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def profile_params
|
32
|
+
params.require(:user_profile).permit(Bbs::UserProfile.permitted_attributes)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -1,9 +1,24 @@
|
|
1
1
|
module Bbs
|
2
|
-
class TopicsController < ApplicationController
|
2
|
+
class TopicsController < Bbs::ApplicationController
|
3
|
+
before_action :authenticate_user!, only: %i(create)
|
3
4
|
before_action :set_category
|
4
5
|
|
6
|
+
def new
|
7
|
+
@topic = @category.topics.build
|
8
|
+
end
|
9
|
+
|
10
|
+
def create
|
11
|
+
@topic = @category.topics.build(topic_params)
|
12
|
+
|
13
|
+
if @topic.save
|
14
|
+
redirect_to bbs.category_topics_path(@category), notice: t('.success')
|
15
|
+
else
|
16
|
+
redirect_back fallback_location: main_app.root_path, alert: @topic.errors.full_messages
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
5
20
|
def index
|
6
|
-
@topics = @category.topics
|
21
|
+
@topics = @category.topics.order(:created_at).page(params[:page]).per(Bbs.config.topics_per_page)
|
7
22
|
end
|
8
23
|
|
9
24
|
private
|
@@ -11,5 +26,10 @@ module Bbs
|
|
11
26
|
def set_category
|
12
27
|
@category = Bbs::Category.find(params[:category_id])
|
13
28
|
end
|
29
|
+
|
30
|
+
def topic_params
|
31
|
+
params.require(:topic).permit(Bbs::Topic.permitted_attributes)
|
32
|
+
.merge(author: current_user)
|
33
|
+
end
|
14
34
|
end
|
15
35
|
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
module Bbs
|
2
|
+
class Avatar < ApplicationRecord
|
3
|
+
has_many :user_profiles, class_name: 'Bbs::UserProfile'
|
4
|
+
|
5
|
+
has_attached_file :image, styles: {medium: '48x48>', thumb: '48x48>'}
|
6
|
+
|
7
|
+
validates_attachment_content_type :image, content_type: /\Aimage\/.*\z/
|
8
|
+
end
|
9
|
+
end
|
data/app/models/bbs/category.rb
CHANGED
data/app/models/bbs/comment.rb
CHANGED
@@ -1,5 +1,8 @@
|
|
1
1
|
module Bbs
|
2
|
-
class Comment < ApplicationRecord
|
3
|
-
belongs_to :topic
|
2
|
+
class Comment < ::Bbs::ApplicationRecord
|
3
|
+
belongs_to :topic, class_name: 'Bbs::Topic'
|
4
|
+
belongs_to :author, class_name: 'Bbs::User'
|
5
|
+
|
6
|
+
validates :title, :body, presence: true, allow_blank: false
|
4
7
|
end
|
5
8
|
end
|
data/app/models/bbs/topic.rb
CHANGED
@@ -1,7 +1,10 @@
|
|
1
1
|
module Bbs
|
2
|
-
class Topic < ApplicationRecord
|
3
|
-
has_many :comments
|
2
|
+
class Topic < ::Bbs::ApplicationRecord
|
3
|
+
has_many :comments, class_name: 'Bbs::Comment', dependent: :delete_all
|
4
4
|
|
5
|
-
belongs_to :category
|
5
|
+
belongs_to :category, class_name: 'Bbs::Category'
|
6
|
+
belongs_to :author, class_name: 'Bbs::User'
|
7
|
+
|
8
|
+
validates :title, :body, presence: true, allow_blank: false
|
6
9
|
end
|
7
10
|
end
|
@@ -1,10 +1,19 @@
|
|
1
|
-
|
1
|
+
- breadcrumb :comments, @topic
|
2
2
|
|
3
|
-
|
4
|
-
- @comments.each do |comment|
|
5
|
-
%li
|
6
|
-
%article
|
7
|
-
%header= comment.title
|
8
|
-
= comment.body
|
3
|
+
= cell('bbs/article', @topic)
|
9
4
|
|
10
|
-
|
5
|
+
%hr
|
6
|
+
|
7
|
+
- @comments.each do |comment|
|
8
|
+
= cell('bbs/article', comment)
|
9
|
+
|
10
|
+
.bbs-pagination
|
11
|
+
= paginate @comments
|
12
|
+
|
13
|
+
- content_for :head do
|
14
|
+
= rel_next_prev_link_tags @comments
|
15
|
+
|
16
|
+
- if logged_in?
|
17
|
+
= render partial: 'bbs/shared/comment_form', locals: {topic: @topic, comment: @comment}
|
18
|
+
- else
|
19
|
+
= link_to t('.require_login'), Bbs.config.login_path, class: 'bbs-button'
|
@@ -0,0 +1,12 @@
|
|
1
|
+
= form_for current_user.profile, url: bbs.profile_path, html: {class: 'bbs-form bbs-form--vertical'} do |f|
|
2
|
+
.bbs-form-group
|
3
|
+
= f.label :avatar_url
|
4
|
+
|
5
|
+
= f.collection_radio_buttons :avatar_id, Bbs::Avatar.all, :id, :id do |r|
|
6
|
+
= r.label { r.radio_button(style: 'width: 1em') + image_tag(r.object.image.url(:medium)) }
|
7
|
+
|
8
|
+
.bbs-form-group
|
9
|
+
= f.label :nickname
|
10
|
+
= f.text_field :nickname
|
11
|
+
|
12
|
+
= f.submit class: 'bbs-button'
|
@@ -1,5 +1,20 @@
|
|
1
|
-
%
|
1
|
+
%article.bbs-topic
|
2
|
+
%h1.bbs-topic__title= t('.title', category: @category.name)
|
2
3
|
|
3
|
-
|
4
|
-
|
5
|
-
|
4
|
+
.bbs-new-topic
|
5
|
+
- if logged_in?
|
6
|
+
= link_to t('.new_topic'), new_category_topic_path(@category), class: 'bbs-button'
|
7
|
+
- else
|
8
|
+
= link_to t('.require_login'), Bbs.config.login_path, class: 'bbs-button'
|
9
|
+
|
10
|
+
%ol.bbs-topic-list
|
11
|
+
- @topics.each do |topic|
|
12
|
+
%li.bbs-topic-item
|
13
|
+
%span= link_to sanitize(topic.title), bbs.topic_comments_path(topic)
|
14
|
+
%span= t('.comment_count', count: topic.comments.count)
|
15
|
+
|
16
|
+
.bbs-pagination
|
17
|
+
= paginate @topics
|
18
|
+
|
19
|
+
- content_for :head do
|
20
|
+
= rel_next_prev_link_tags @topics
|
@@ -0,0 +1,16 @@
|
|
1
|
+
%h1
|
2
|
+
カテゴリ
|
3
|
+
= @category.name
|
4
|
+
に
|
5
|
+
= t('.create')
|
6
|
+
|
7
|
+
= form_for [bbs, @category, @topic], html: {class: 'bbs-form bbs-form--vertical'} do |f|
|
8
|
+
.bbs-form-group
|
9
|
+
= f.label :title
|
10
|
+
= f.text_field :title
|
11
|
+
|
12
|
+
.bbs-form-group
|
13
|
+
= f.label :body
|
14
|
+
= f.text_area :body
|
15
|
+
|
16
|
+
= f.submit class: 'bbs-button'
|
@@ -0,0 +1,13 @@
|
|
1
|
+
crumb :root do
|
2
|
+
link t('bbs.breadcrumbs.home'), main_app.root_path
|
3
|
+
end
|
4
|
+
|
5
|
+
crumb :category do |category|
|
6
|
+
link category.name, bbs.category_topics_path(category)
|
7
|
+
end
|
8
|
+
|
9
|
+
crumb :comments do |topic|
|
10
|
+
link topic.title, bbs.topic_comments_path(topic)
|
11
|
+
|
12
|
+
parent :category, topic.category
|
13
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
en:
|
2
|
+
activerecord:
|
3
|
+
errors:
|
4
|
+
models:
|
5
|
+
bbs/topic:
|
6
|
+
attributes:
|
7
|
+
author:
|
8
|
+
required: Login required.
|
9
|
+
bbs/comment:
|
10
|
+
attributes:
|
11
|
+
author:
|
12
|
+
required: Login required.
|
13
|
+
attributes:
|
14
|
+
bbs/topic:
|
15
|
+
title: Title
|
16
|
+
body: Topic body
|
17
|
+
bbs/comment:
|
18
|
+
title: Title
|
19
|
+
body: Comment body
|
20
|
+
bbs/user_profile:
|
21
|
+
avatar_url: Avatar
|
22
|
+
nickname: Nickname
|
23
|
+
helpers:
|
24
|
+
submit:
|
25
|
+
topic:
|
26
|
+
create: Create new topic
|
27
|
+
comment:
|
28
|
+
create: Post new comment
|
29
|
+
bbs:
|
30
|
+
topics:
|
31
|
+
index:
|
32
|
+
title: topics for %{category}
|
33
|
+
new_topic: create a new topic
|
34
|
+
comment_count: (%{count} comments)
|
35
|
+
require_login: login required before create a new topic
|
36
|
+
new:
|
37
|
+
create: Create new topic
|
38
|
+
create:
|
39
|
+
success: new topic created
|
40
|
+
comments:
|
41
|
+
index:
|
42
|
+
posted_at: posted at
|
43
|
+
require_login: to view comments you must be logged
|
44
|
+
create:
|
45
|
+
success: commented
|
46
|
+
category:
|
47
|
+
title: Categories
|
48
|
+
latest_topics:
|
49
|
+
title: Latest topics
|
50
|
+
breadcrumbs:
|
51
|
+
home: Home
|
52
|
+
profiles:
|
53
|
+
create:
|
54
|
+
success: profile successfully created
|
55
|
+
update:
|
56
|
+
success: profile successfully updated
|
@@ -0,0 +1,56 @@
|
|
1
|
+
ja:
|
2
|
+
activerecord:
|
3
|
+
errors:
|
4
|
+
models:
|
5
|
+
bbs/topic:
|
6
|
+
attributes:
|
7
|
+
author:
|
8
|
+
required: 投稿者がありません。
|
9
|
+
bbs/comment:
|
10
|
+
attributes:
|
11
|
+
author:
|
12
|
+
required: 投稿者がありません。
|
13
|
+
attributes:
|
14
|
+
bbs/topic:
|
15
|
+
title: タイトル
|
16
|
+
body: 本文
|
17
|
+
bbs/comment:
|
18
|
+
title: タイトル
|
19
|
+
body: 本文
|
20
|
+
bbs/user_profile:
|
21
|
+
avatar_url: アバター
|
22
|
+
nickname: ニックネーム
|
23
|
+
helpers:
|
24
|
+
submit:
|
25
|
+
topic:
|
26
|
+
create: トピックを作成する
|
27
|
+
comment:
|
28
|
+
create: 投稿する
|
29
|
+
bbs:
|
30
|
+
topics:
|
31
|
+
index:
|
32
|
+
title: '%{category}のトピック'
|
33
|
+
new_topic: 新しいトピックを立てる
|
34
|
+
comment_count: (コメント %{count} 件)
|
35
|
+
require_login: トピックを立てるにはログインしてください
|
36
|
+
new:
|
37
|
+
create: 新しいトピックを作成します
|
38
|
+
create:
|
39
|
+
success: トピックを立てました
|
40
|
+
comments:
|
41
|
+
index:
|
42
|
+
posted_at: 投稿日時
|
43
|
+
require_login: コメントを閲覧するにはログインしてください
|
44
|
+
create:
|
45
|
+
success: コメントしました
|
46
|
+
category:
|
47
|
+
title: カテゴリ
|
48
|
+
latest_topics:
|
49
|
+
title: 最新トピック
|
50
|
+
breadcrumbs:
|
51
|
+
home: ホーム
|
52
|
+
profiles:
|
53
|
+
create:
|
54
|
+
success: プロフィールを作成しました
|
55
|
+
update:
|
56
|
+
success: プロフィールを更新しました
|
data/config/routes.rb
CHANGED
@@ -0,0 +1,13 @@
|
|
1
|
+
class CreateBbsUserProfiles < ActiveRecord::Migration[5.0]
|
2
|
+
def change
|
3
|
+
create_table :bbs_user_profiles do |t|
|
4
|
+
t.integer :user_id, null: false
|
5
|
+
t.string :avatar_url
|
6
|
+
t.string :nickname
|
7
|
+
|
8
|
+
t.timestamps
|
9
|
+
end
|
10
|
+
|
11
|
+
add_foreign_key :bbs_user_profiles, :bbs_users, column: :user_id
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,8 @@
|
|
1
|
+
class RenameAvatarColumn < ActiveRecord::Migration[5.0]
|
2
|
+
def change
|
3
|
+
rename_column :bbs_avatars, :avatar_file_name, :image_file_name
|
4
|
+
rename_column :bbs_avatars, :avatar_content_type, :image_content_type
|
5
|
+
rename_column :bbs_avatars, :avatar_file_size, :image_file_size
|
6
|
+
rename_column :bbs_avatars, :avatar_updated_at, :image_updated_at
|
7
|
+
end
|
8
|
+
end
|
data/lib/bbs.rb
CHANGED
@@ -1,5 +1,16 @@
|
|
1
|
-
require
|
1
|
+
require 'bbs/engine'
|
2
|
+
require 'bbs/configuration'
|
2
3
|
|
3
4
|
module Bbs
|
4
|
-
|
5
|
+
mattr_accessor :config
|
6
|
+
|
7
|
+
def config
|
8
|
+
@config ||= Bbs::Configuration.new
|
9
|
+
end
|
10
|
+
|
11
|
+
def configure
|
12
|
+
yield(config)
|
13
|
+
end
|
14
|
+
|
15
|
+
module_function :config, :configure
|
5
16
|
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Bbs
|
2
|
+
class Configuration
|
3
|
+
attr_accessor :clamp_article_body, :login_path, :latest_topics_count,
|
4
|
+
:topics_per_page, :comments_per_page, :current_user,
|
5
|
+
:authenticate_user
|
6
|
+
|
7
|
+
def clamp_article_body
|
8
|
+
@clamp_article_body ||= 100
|
9
|
+
end
|
10
|
+
|
11
|
+
def login_path
|
12
|
+
@login_path ||= '/'
|
13
|
+
end
|
14
|
+
|
15
|
+
def latest_topics_count
|
16
|
+
@latest_topics_count ||= 10
|
17
|
+
end
|
18
|
+
|
19
|
+
def topics_per_page
|
20
|
+
@topics_per_page ||= 10
|
21
|
+
end
|
22
|
+
|
23
|
+
def comments_per_page
|
24
|
+
@comments_per_page ||= 10
|
25
|
+
end
|
26
|
+
|
27
|
+
def current_user
|
28
|
+
@current_user ||= :current_user
|
29
|
+
end
|
30
|
+
|
31
|
+
def authenticate_user
|
32
|
+
@authenticate_user ||= :authenticate_user!
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
data/lib/bbs/engine.rb
CHANGED
@@ -1,9 +1,20 @@
|
|
1
1
|
require 'cells-rails'
|
2
2
|
require 'cells-hamlit'
|
3
|
+
require 'gretel'
|
3
4
|
require 'kaminari'
|
5
|
+
require 'paperclip'
|
6
|
+
require 'rails-i18n'
|
4
7
|
|
5
8
|
module Bbs
|
6
9
|
class Engine < ::Rails::Engine
|
7
10
|
isolate_namespace Bbs
|
11
|
+
|
12
|
+
config.to_prepare do
|
13
|
+
Dir.glob(Rails.root + 'app/engines/**/*.rb').each do |c|
|
14
|
+
require_dependency(c)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
ActiveSupport.run_load_hooks :bbs_engine, Bbs::Engine
|
8
19
|
end
|
9
20
|
end
|
data/lib/bbs/version.rb
CHANGED
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'rails/generators/base'
|
2
|
+
|
3
|
+
module Bbs
|
4
|
+
module Generators
|
5
|
+
class InitializerGenerator < Rails::Generators::Base
|
6
|
+
hide!
|
7
|
+
|
8
|
+
source_root File.expand_path('../templates', __FILE__)
|
9
|
+
|
10
|
+
def copy_initialier
|
11
|
+
copy_file 'bbs.rb', 'config/initializers/bbs.rb'
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
class LocaleGenerator < Rails::Generators::Base
|
16
|
+
hide!
|
17
|
+
|
18
|
+
source_root Bbs::Engine.root.join('config/locales').to_s
|
19
|
+
|
20
|
+
def copy_locales
|
21
|
+
%w(bbs.en.yml bbs.ja.yml).each do |locale|
|
22
|
+
copy_file locale, "config/locales/#{locale}"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
class ConfigGenerator < Rails::Generators::Base
|
28
|
+
invoke InitializerGenerator
|
29
|
+
invoke LocaleGenerator
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
Bbs.configure do |config|
|
2
|
+
# clamp line specified words.
|
3
|
+
# for example, if you set `config.clamp_article_body` to `10`,
|
4
|
+
# comment or topics body will clamp 10 words when user does not logged in.
|
5
|
+
#
|
6
|
+
# If you set value `false`, never clamp line.
|
7
|
+
#config.clamp_article_body = 10
|
8
|
+
|
9
|
+
# spedify sign in path
|
10
|
+
#config.login_path = '/users/sign_in'
|
11
|
+
|
12
|
+
# set number of latest topics inside component
|
13
|
+
#config.latest_topics_count = 10
|
14
|
+
|
15
|
+
# set number of topics per page
|
16
|
+
#config.topics_per_page = 10
|
17
|
+
|
18
|
+
# set number of topics per page
|
19
|
+
#config.comments_per_page = 10
|
20
|
+
|
21
|
+
# set current_user method
|
22
|
+
config.current_user = :current_user
|
23
|
+
|
24
|
+
# set authenticate user method
|
25
|
+
config.authenticate_user = :authenticate_user!
|
26
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'rails/generators/base'
|
2
|
+
|
3
|
+
module Bbs
|
4
|
+
module Generators
|
5
|
+
class ViewsGenerator < Rails::Generators::Base
|
6
|
+
source_root Bbs::Engine.root.join('app/views/bbs').to_s
|
7
|
+
|
8
|
+
def copy_views
|
9
|
+
%w(comments profiles shared topics).each do |resource|
|
10
|
+
directory resource, "app/views/bbs/#{resource}"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bbs
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
-
-
|
7
|
+
- ''
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-11-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -30,6 +30,20 @@ dependencies:
|
|
30
30
|
- - ">="
|
31
31
|
- !ruby/object:Gem::Version
|
32
32
|
version: 5.0.0.1
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: bourbon
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - ">="
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '0'
|
40
|
+
type: :runtime
|
41
|
+
prerelease: false
|
42
|
+
version_requirements: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - ">="
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '0'
|
33
47
|
- !ruby/object:Gem::Dependency
|
34
48
|
name: cells-hamlit
|
35
49
|
requirement: !ruby/object:Gem::Requirement
|
@@ -58,6 +72,20 @@ dependencies:
|
|
58
72
|
- - ">="
|
59
73
|
- !ruby/object:Gem::Version
|
60
74
|
version: '0'
|
75
|
+
- !ruby/object:Gem::Dependency
|
76
|
+
name: gretel
|
77
|
+
requirement: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - ">="
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: '0'
|
82
|
+
type: :runtime
|
83
|
+
prerelease: false
|
84
|
+
version_requirements: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - ">="
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: '0'
|
61
89
|
- !ruby/object:Gem::Dependency
|
62
90
|
name: kaminari
|
63
91
|
requirement: !ruby/object:Gem::Requirement
|
@@ -72,6 +100,48 @@ dependencies:
|
|
72
100
|
- - ">="
|
73
101
|
- !ruby/object:Gem::Version
|
74
102
|
version: '0'
|
103
|
+
- !ruby/object:Gem::Dependency
|
104
|
+
name: paperclip
|
105
|
+
requirement: !ruby/object:Gem::Requirement
|
106
|
+
requirements:
|
107
|
+
- - ">="
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
110
|
+
type: :runtime
|
111
|
+
prerelease: false
|
112
|
+
version_requirements: !ruby/object:Gem::Requirement
|
113
|
+
requirements:
|
114
|
+
- - ">="
|
115
|
+
- !ruby/object:Gem::Version
|
116
|
+
version: '0'
|
117
|
+
- !ruby/object:Gem::Dependency
|
118
|
+
name: rails-i18n
|
119
|
+
requirement: !ruby/object:Gem::Requirement
|
120
|
+
requirements:
|
121
|
+
- - ">="
|
122
|
+
- !ruby/object:Gem::Version
|
123
|
+
version: '0'
|
124
|
+
type: :runtime
|
125
|
+
prerelease: false
|
126
|
+
version_requirements: !ruby/object:Gem::Requirement
|
127
|
+
requirements:
|
128
|
+
- - ">="
|
129
|
+
- !ruby/object:Gem::Version
|
130
|
+
version: '0'
|
131
|
+
- !ruby/object:Gem::Dependency
|
132
|
+
name: minitest-rails-capybara
|
133
|
+
requirement: !ruby/object:Gem::Requirement
|
134
|
+
requirements:
|
135
|
+
- - ">="
|
136
|
+
- !ruby/object:Gem::Version
|
137
|
+
version: '0'
|
138
|
+
type: :development
|
139
|
+
prerelease: false
|
140
|
+
version_requirements: !ruby/object:Gem::Requirement
|
141
|
+
requirements:
|
142
|
+
- - ">="
|
143
|
+
- !ruby/object:Gem::Version
|
144
|
+
version: '0'
|
75
145
|
- !ruby/object:Gem::Dependency
|
76
146
|
name: pg
|
77
147
|
requirement: !ruby/object:Gem::Requirement
|
@@ -86,9 +156,37 @@ dependencies:
|
|
86
156
|
- - ">="
|
87
157
|
- !ruby/object:Gem::Version
|
88
158
|
version: '0'
|
159
|
+
- !ruby/object:Gem::Dependency
|
160
|
+
name: pry-byebug
|
161
|
+
requirement: !ruby/object:Gem::Requirement
|
162
|
+
requirements:
|
163
|
+
- - ">="
|
164
|
+
- !ruby/object:Gem::Version
|
165
|
+
version: '0'
|
166
|
+
type: :development
|
167
|
+
prerelease: false
|
168
|
+
version_requirements: !ruby/object:Gem::Requirement
|
169
|
+
requirements:
|
170
|
+
- - ">="
|
171
|
+
- !ruby/object:Gem::Version
|
172
|
+
version: '0'
|
173
|
+
- !ruby/object:Gem::Dependency
|
174
|
+
name: simplecov
|
175
|
+
requirement: !ruby/object:Gem::Requirement
|
176
|
+
requirements:
|
177
|
+
- - ">="
|
178
|
+
- !ruby/object:Gem::Version
|
179
|
+
version: '0'
|
180
|
+
type: :development
|
181
|
+
prerelease: false
|
182
|
+
version_requirements: !ruby/object:Gem::Requirement
|
183
|
+
requirements:
|
184
|
+
- - ">="
|
185
|
+
- !ruby/object:Gem::Version
|
186
|
+
version: '0'
|
89
187
|
description: Description of Bbs.
|
90
188
|
email:
|
91
|
-
-
|
189
|
+
- jp.bm-sms.developers@bm-sms.jp
|
92
190
|
executables: []
|
93
191
|
extensions: []
|
94
192
|
extra_rdoc_files: []
|
@@ -98,24 +196,39 @@ files:
|
|
98
196
|
- Rakefile
|
99
197
|
- app/assets/config/bbs_manifest.js
|
100
198
|
- app/assets/javascripts/bbs/application.js
|
199
|
+
- app/assets/stylesheets/bbs/_article.css.sass
|
200
|
+
- app/assets/stylesheets/bbs/_bbs-list.css.sass
|
201
|
+
- app/assets/stylesheets/bbs/_button.css.sass
|
202
|
+
- app/assets/stylesheets/bbs/_form.css.sass
|
203
|
+
- app/assets/stylesheets/bbs/_new-topic.css.sass
|
101
204
|
- app/assets/stylesheets/bbs/application.css
|
102
205
|
- app/cells/bbs/application_cell.rb
|
206
|
+
- app/cells/bbs/article/show.haml
|
207
|
+
- app/cells/bbs/article_cell.rb
|
103
208
|
- app/cells/bbs/category/show.haml
|
104
209
|
- app/cells/bbs/category_cell.rb
|
105
210
|
- app/cells/bbs/latest_topics/show.haml
|
106
211
|
- app/cells/bbs/latest_topics_cell.rb
|
107
212
|
- app/controllers/bbs/application_controller.rb
|
108
213
|
- app/controllers/bbs/comments_controller.rb
|
214
|
+
- app/controllers/bbs/concerns/authenticatable.rb
|
215
|
+
- app/controllers/bbs/profiles_controller.rb
|
109
216
|
- app/controllers/bbs/topics_controller.rb
|
110
217
|
- app/helpers/bbs/application_helper.rb
|
111
218
|
- app/jobs/bbs/application_job.rb
|
112
219
|
- app/mailers/bbs/application_mailer.rb
|
113
220
|
- app/models/bbs/application_record.rb
|
221
|
+
- app/models/bbs/avatar.rb
|
114
222
|
- app/models/bbs/category.rb
|
115
223
|
- app/models/bbs/comment.rb
|
116
224
|
- app/models/bbs/topic.rb
|
225
|
+
- app/models/bbs/user.rb
|
226
|
+
- app/models/bbs/user_profile.rb
|
117
227
|
- app/views/bbs/comments/index.html.haml
|
228
|
+
- app/views/bbs/profiles/edit.html.haml
|
229
|
+
- app/views/bbs/shared/_comment_form.html.haml
|
118
230
|
- app/views/bbs/topics/index.html.haml
|
231
|
+
- app/views/bbs/topics/new.html.haml
|
119
232
|
- app/views/kaminari/_first_page.html.haml
|
120
233
|
- app/views/kaminari/_gap.html.haml
|
121
234
|
- app/views/kaminari/_last_page.html.haml
|
@@ -123,13 +236,26 @@ files:
|
|
123
236
|
- app/views/kaminari/_page.html.haml
|
124
237
|
- app/views/kaminari/_paginator.html.haml
|
125
238
|
- app/views/kaminari/_prev_page.html.haml
|
239
|
+
- config/breadcrumbs.rb
|
240
|
+
- config/locales/bbs.en.yml
|
241
|
+
- config/locales/bbs.ja.yml
|
126
242
|
- config/routes.rb
|
127
243
|
- db/migrate/20160815075807_create_bbs_categories.rb
|
128
244
|
- db/migrate/20160815075844_create_bbs_topics.rb
|
129
245
|
- db/migrate/20160815080614_create_bbs_comments.rb
|
246
|
+
- db/migrate/20160817082220_add_author_id.rb
|
247
|
+
- db/migrate/20160902071411_create_bbs_users.rb
|
248
|
+
- db/migrate/20160902071450_create_bbs_user_profiles.rb
|
249
|
+
- db/migrate/20160928082713_create_bbs_avatars.rb
|
250
|
+
- db/migrate/20160930093905_add_avatar_id_to_user.rb
|
251
|
+
- db/migrate/20161028081055_rename_avatar_column.rb
|
130
252
|
- lib/bbs.rb
|
253
|
+
- lib/bbs/configuration.rb
|
131
254
|
- lib/bbs/engine.rb
|
132
255
|
- lib/bbs/version.rb
|
256
|
+
- lib/generators/bbs/config_generator.rb
|
257
|
+
- lib/generators/bbs/templates/bbs.rb
|
258
|
+
- lib/generators/bbs/views_generator.rb
|
133
259
|
- lib/tasks/bbs_tasks.rake
|
134
260
|
homepage: ''
|
135
261
|
licenses:
|