シラサギハンズオン 東京

140
Ruby/Rails/mongoDBで動作する中・大規模サイト向けCMS「シラサギ」のハンズオン

Transcript of シラサギハンズオン 東京

Page 1: シラサギハンズオン 東京

Ruby/Rails/mongoDBで動作する中・大規模サイト向けCMS「シラサギ」のハンズオン

Page 2: シラサギハンズオン 東京

登壇者

ウェブチップス

1. 野原

2. 中野

3. 伊藤

Page 3: シラサギハンズオン 東京

ハンズオンの狙い

1. シラサギの概要を理解する。

2. シラサギの仕組みを理解する。

3. シラサギの機能追加と機能拡張の方法を理解する。

Page 4: シラサギハンズオン 東京

ハンズオン 目次

1. シラサギの紹介 [10min]

2. ハンズオンの導入 [15min]

3. ハンズオン [60min]

1. 開発サンプル紹介

2. 準備

3. ブログページ作成

4. 天気入力フォーム作成

5. 一覧フォルダー作成

Page 5: シラサギハンズオン 東京

シラサギの紹介

Page 6: シラサギハンズオン 東京

会社概要

会社名

設立

資本金

所在地

役員

株式会社ウェブチップス

2013年9月20日

500万円

〒770-0872 徳島県徳島市北沖洲三丁目6番58号 石本ビル202

代表取締役社長CEO 野原 直一技術担当取締役CTO 谷沢 和寿

5名(役員含む) 2015年1月から6名に

オープンソースソフトウェア開発事業

オープンソースを使った導入・カスタマイズ事業

オープンソースを使ったクラウドサービス事業

社員数

事業内容

Page 7: シラサギハンズオン 東京

名称の由来

サギ科の鳥のうち、全身の羽毛が白いものを「シラサギ」と呼びます。

徳島県では1965年10月から「シラサギ」を県の鳥に指定しています。

サギ類は、他の種類のサギたちと一緒に巣を作り、繁殖するという特徴があります。

その様子が、様々な企業と技術者でコミュニティを形成し、ソフトウェアを開発していくというコンセプトと一致したためこの名称を採用しました。

「シラサギ」は、みんなで育てるCMSです。

Page 8: シラサギハンズオン 東京

MITライセンス

誰でも自由にカスタマイズできます。誰でも自由にフォークできます。拡張機能を公開するかどうかを自由に選べます。

Page 9: シラサギハンズオン 東京

Webアプリ開発プラットフォーム

CMSですが、コアの設計は汎用SNSになっており、Webアプリ開発プラットフォームとして利用できます。将来的にグループウェア、SNSなどの様々なアプリケーションの開発ができます。

Page 10: シラサギハンズオン 東京

モデルアドオン設計

下記をカプセル化して任意のコレクションに取り付けられます。

・DBのフィールド・データ検証や保存ロジック・編集画面・詳細画面

アドオンをうまく使うことで、モジュールの肥大化を抑えられます。結果、ソース管理が非常に楽になります。

Page 11: シラサギハンズオン 東京

MongoDB

NoSQLであるMongoDBを採用し、高速化を実現しています。

公開されているフォルダ・ページには、リレーションによる関連付けはなく、それぞれがファイル名(URL)を保持しています。

そのため、MongoDBの強みである前方一致検索のパフォーマンスを最大限に引き出せます。そのため、任意のフォルダ内の検索も非常に高速かつ効率的に行えます。

Page 12: シラサギハンズオン 東京

動作環境

Internet Explorer (ver.8 以上)、Firefox、Chrome、Safariの最新バージョンを想定しています。

対象 バージョンなど

OS CentOS 6.5 64bit

Webサーバ nginx + unicorn

DBシステム MongoDB

Ruby 2.1.2

Ruby on Rails 4.1.4

Page 13: シラサギハンズオン 東京

初期データ

市町村向けの自治体サンプルデータ、企業サンプルデータを初期データとして提供しています。

インストール時に初期データを切り替えられます。

今後も様々なサンプルデータを提供していきます。・子育てサイトサンプル・大学サンプル・県向け自治体サンプルなど

Page 14: シラサギハンズオン 東京

初期データを使ったホームページ作成(1)

初期データ「企業サンプル」 企業向けホームページ

ロゴ写真色レイアウトを調整

Page 15: シラサギハンズオン 東京

初期データを使ったホームページ作成(2)

初期データ「自治体サンプル」 自治体向けホームページ

ロゴ写真色レイアウトを調整

Page 16: シラサギハンズオン 東京

拡張プラグイン

独自の拡張プラグイン機能「egg(エッグ)」があります。モジュールとして追加したコンテンツのプラグイン化、デプロイが行えます。

Page 17: シラサギハンズオン 東京

地図データベース機能

表示項目検索条件などを調整

バリアフリーマップ

拡張プラグインを使ったウェブシステム開発

Page 18: シラサギハンズオン 東京

マルチテナント対応

同一データベース同一スキーマ方式を採用しています。これにより管理者の運用コストを軽減できます。

Page 19: シラサギハンズオン 東京

マルチテナントを使ったサービス提供

シラサギのクラウドサービスを立ち上げ、同じコンテンツサイトを横並びで構築していく。例:徳島県オープンデータポータルサイトと各市町村オープンデータサイト

Page 20: シラサギハンズオン 東京

Ajaxレイアウト(バージョン0.5.0でAjaxパーツに)

即時反映と低負荷を実現します。ページは、検索クローラーを想定して静的HTMLファイルを書き出します。レイアウト、記事リストなどのパーツは、動的表示となります。

Page 21: シラサギハンズオン 東京

マルチデバイス対応

公開画面及び管理画面は、PC、スマホ、携帯、タブレットなど様々なデバイスに対応。

Page 22: シラサギハンズオン 東京

GitHubによる公開開発

既にシラサギの開発に共感してくれている個人のエンジニアの方から、プルリクエスト(開発したプログラムを取り込む依頼)を定期的にいただいています。

Page 23: シラサギハンズオン 東京

シラサギ公式サイト

新着情報リリースノートよくある質問ダウンロードオンラインデモ導入事例開発情報など

http://ss-proj.org/

Page 24: シラサギハンズオン 東京

シラサギプロジェクト開発コミュニティ

シラサギプロジェクトの開発コミュニティをfacebook上の公開グループとして立ち上げています。

リリース詳細や他のエンジニアの方からのレポートなども掲載されていますので、是非ご参加ください。

Page 25: シラサギハンズオン 東京

ハンズオンの導入

Page 26: シラサギハンズオン 東京

ハンズオンの狙い

1. シラサギの概要を理解する。

2. シラサギの仕組みを理解する。

3. シラサギの機能追加と機能拡張の方法を理解する。

Page 27: シラサギハンズオン 東京

導入

管理画面

1. メニューやコンテキストメニューの操作方法

2. フォルダ

3. レイアウト

4. パーツ

5. ページ

6. アドオン

Page 28: シラサギハンズオン 東京

シラサギデモ

http://ss-proj.org/download/demo.html

Googleで「shirasagi demo」を検索してもOK

Page 29: シラサギハンズオン 東京

公開画面と管理画面

Page 30: シラサギハンズオン 東京

管理画面 –システム管理

Page 31: シラサギハンズオン 東京

管理画面 –サイト管理

Page 32: シラサギハンズオン 東京

管理画面 –フォルダ一覧

Page 33: シラサギハンズオン 東京

管理画面 –フォルダ詳細

Page 34: シラサギハンズオン 東京

管理画面 –レイアウト一覧

Page 35: シラサギハンズオン 東京

管理画面 –レイアウト詳細

Page 36: シラサギハンズオン 東京

管理画面 –パーツ

Page 37: シラサギハンズオン 東京

管理画面 –記事一覧

Page 38: シラサギハンズオン 東京

管理画面 –記事詳細

Page 39: シラサギハンズオン 東京

Rails モデルクラスでのアドオン

class Article::Pageinclude Cms::Page::Modelinclude Cms::Addon::Metainclude Cms::Addon::Bodyinclude Cms::Addon::Fileinclude Cms::Addon::Releaseinclude Cms::Addon::ReleasePlaninclude Cms::Addon::RelatedPageinclude Category::Addon::Categoryinclude Event::Addon::Dateinclude Map::Addon::Pageinclude Workflow::Addon::Approverinclude Contact::Addon::Pageinclude History::Addon::Backup

Page 40: シラサギハンズオン 東京

振り返り

管理画面

1. メニューやコンテキストメニューの操作方法

2. フォルダ – イベントカレンダーフォルダ、記事フォルダ、...

3. レイアウト

4. パーツ

5. ページ – イベントページ、記事ページ、…

6. アドオン

Page 41: シラサギハンズオン 東京

ハンズオン環境構築

Page 42: シラサギハンズオン 東京

ハンズオンの環境構築

環境構築

1. VirtualBox インストール

2. Vagrant インストール

3. Windows の方だけ

1. git のインストール

2. Tera Term インストール

4. シラサギ・ハンズオン環境のインストール

Page 43: シラサギハンズオン 東京

VirtualBox & Vagrant インストール

■VirtualBox

https://www.virtualbox.org/wiki/DownloadsGoogleで「virtualbox download」を検索してもOK

■Vagrant

https://www.vagrantup.com/downloads.htmlGoogleで「vagrant download」を検索してもOK

Page 44: シラサギハンズオン 東京

Windows の方だけ

■Git

https://msysgit.github.io/Googleで「windows git」を検索してもOK

■Tera Term

http://sourceforge.jp/projects/ttssh2/releases/

Googleで「teraterm download」を検索してもOK

Page 45: シラサギハンズオン 東京

ハンズオン用Github

https://github.com/itowtips/ss-handson

Googleで「github itowtips」を検索してもOK

SSID: XXXXXXXXPASS: xxxxxxxx

Page 46: シラサギハンズオン 東京

ハンズオン用Github

https://github.com/itowtips/ss-handson

Vagrantfileをダウンロード

Page 47: シラサギハンズオン 東京

ハンズオン環境の起動

> cd Vagrantfileをダウンロードしたディレクトリ> vagrant up

Page 48: シラサギハンズオン 東京

ハンズオン環境へログイン

■Windowsの方IPアドレス: localhostポート: 2222User: vagrantPassword: vagrant

■Mac, Linux の方$ vagrant ssh

Page 49: シラサギハンズオン 東京

シラサギハンズオン

Page 50: シラサギハンズオン 東京

ハンズオン 目次

1. 開発サンプル紹介

2. 準備

3. ブログページ作成

4. 天気入力フォーム作成

5. 一覧フォルダー作成

Page 51: シラサギハンズオン 東京

開発サンプル 紹介

SHIRASAGI Wiki

https://github.com/shirasagi/shirasagi/wiki

開発サンプル:ブログページ

https://github.com/shirasagi/shirasagi/wiki/開発サンプル:ブログページ

今回のハンズオンで使用するリポジトリ、コマンド集などあります

https://github.com/itowtips/ss-handson

※これを見ながら進めていきます

Page 52: シラサギハンズオン 東京

開発サンプル 紹介

シラサギWiki:開発サンプルブログページ

シラサギにはページを作成し公開できる機能がいくつかあります• 記事ページ• 固定ページ• イベントページ• FAQページ

Page 53: シラサギハンズオン 東京

開発サンプル 紹介

シラサギWiki:開発サンプルブログページ

シラサギにはページを作成し公開できる機能がいくつかあります• 記事ページ• 固定ページ• イベントページ• FAQページ• ブログページ ← 今回はこれを追加します

Page 54: シラサギハンズオン 東京

開発サンプル 紹介

シラサギWiki:開発サンプルブログページ

今回の開発の流れ

0. 開発用のシラサギインストール

シラサギのインストール、デモデータの登録ができるようになります

1. ブログページ作成ページの追加を行います 独自のページが作れるようになります

2. 天気入力フォーム作成アドオンの追加を行います 入力フォームの拡張ができるようになります

3. フォルダーの追加

作成したページ用一覧フォルダーの追加を行います

新しいタイプのフォルダー作成ができるようになります

Page 55: シラサギハンズオン 東京

ハンズオン 目次

1. 開発サンプル紹介

2. 準備

3. ブログページ作成

4. 天気入力フォーム作成

5. 一覧フォルダー作成

Page 56: シラサギハンズオン 東京

準備 前提知識

シラサギで使っている技術• Ruby & Ruby On Rails• Javascript & CoffeeScript• Css & Scss• Git• MongoDB

Page 57: シラサギハンズオン 東京

準備 前提知識

シラサギで使っている技術• Ruby & Ruby On Rails• Javascript & CoffeeScript• Css & Scss• Git• MongoDB

Page 58: シラサギハンズオン 東京

準備 Gitとソースコード

シラサギの動く環境がある方はGitHubからソースコードを取得してください

#cd $HOME#git clone https://github.com/itowtips/ss-handson sample#cd sample

Page 59: シラサギハンズオン 東京

準備 Gitとソースコード

必要な設定ファイル(各種ymlとunicorn.rb)をコピーします

#cd $HOME#git clone https://github.com/itowtips/ss-handson sample#cd sample#cp config/samples/* config/

Page 60: シラサギハンズオン 東京

準備 Gitとソースコード

bundle install

#cd $HOME#git clone https://github.com/itowtips/ss-handson sample#cd sample#cp config/samples/* config/#bundle install

Page 61: シラサギハンズオン 東京

準備 MongoDB設定

# vi config/mongoid.yml- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# mongodb configurationproduction:sessions:default:database: ss

development:# Configure available database sessions. (required)sessions:# Defines the default session. (required)default:

# Defines the name of the default database that Mongoid can connect to.# (required).database: ss

使用するデータベース名を変更します production & development

Page 62: シラサギハンズオン 東京

準備 MongoDB設定

# vi config/mongoid.yml- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# mongodb configurationproduction:sessions:default:database: ss_sample

development:# Configure available database sessions. (required)sessions:# Defines the default session. (required)default:

# Defines the name of the default database that Mongoid can connect to.# (required).database: ss_sample

使用するデータベース名を変更します production & development

Page 63: シラサギハンズオン 東京

準備 RAILS_ENV

# vi config/environment.yml- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# default environment RAILS_ENV: production- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Railsをdevelopmentモードに

Page 64: シラサギハンズオン 東京

準備 RAILS_ENV

# vi config/environment.yml- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# default environment RAILS_ENV: development- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Railsをdevelopmentモードに

Page 65: シラサギハンズオン 東京

準備 サンプルデータ

#rake db:create_indexes

MongoDB インデックス作成

Page 66: シラサギハンズオン 東京

準備 サンプルデータ

#rake db:create_indexes#rake ss:create_user data='{ name: "システム管理者", email: "[email protected]", password: "pass" }'

システム管理者作成

Page 67: シラサギハンズオン 東京

準備 サンプルデータ

#rake db:create_indexes#rake ss:create_user data='{ name: "システム管理者", email: "[email protected]", password: "pass" }'#rake ss:create_site data='{ name: "サイト名", host: "www", domains: "ドメイン:3000" }'

サイト作成

ローカル環境のIP例) 192.168.182.128

Page 68: シラサギハンズオン 東京

準備 サンプルデータ

#rake db:create_indexes#rake ss:create_user data='{ name: "システム管理者", email: "[email protected]", password: "pass" }'#rake ss:create_site data='{ name: "サイト名", host: "www", domains: "ドメイン:3000" }'#rake db:seed name=users site=www

サンプルユーザ&グループ作成

Page 69: シラサギハンズオン 東京

準備 サンプルデータ

#rake db:create_indexes#rake ss:create_user data='{ name: "システム管理者", email: "[email protected]", password: "pass" }'#rake ss:create_site data='{ name: "サイト名", host: "www", domains: "ドメイン:3000" }'#rake db:seed name=users site=www#rake db:seed name=demo site=www

自治体サンプルデータ投入

Page 70: シラサギハンズオン 東京

準備 サンプルデータ

#rake db:create_indexes#rake ss:create_user data='{ name: "システム管理者", email: "[email protected]", password: "pass" }'#rake ss:create_site data='{ name: "サイト名", host: "www", domains: "ドメイン:3000" }'#rake db:seed name=users site=www#rake db:seed name=demo site=www#rake unicorn:start

unicorn起動

Page 71: シラサギハンズオン 東京

準備 確認

http://ドメイン:3000/

Page 72: シラサギハンズオン 東京

ハンズオン 目次

1. 開発サンプル紹介

2. 準備

3. ブログページ作成

4. 天気入力フォーム作成

5. 一覧フォルダー作成

Page 74: シラサギハンズオン 東京

ブログページ作成

シラサギWiki:ブログページ作成

※管理画面でブログページが作成できるようになります。

Page 75: シラサギハンズオン 東京

ブログページ作成

シラサギWiki:ブログページ作成

※公開画面での表示。まずは既存のページを参考に、同様のものを作成します。

Page 76: シラサギハンズオン 東京

ブログページ作成 シラサギの構成

/ – app├ models├ views └ controllers

└ config – locales└ routes

ソースコードをエディタで開いてみてください

Page 77: シラサギハンズオン 東京

ブログページ作成 シラサギの構成

/ – app├ models├ views └ controllers

└ config – locales└ routes

シラサギ独特な構成• 公開画面、管理画面がある• 再利用可能なプログラムがある• 静的HTML書き出し機能がある …

Page 78: シラサギハンズオン 東京

ブログページ作成 シラサギの構成

/ – app├ models├ views └ controllers

└ config – locales└ routes

シラサギ独特な構成• routes• addon• agents

Page 79: シラサギハンズオン 東京

ブログページ作成 routes

/ – app├ models├ views └ controllers

└ config – locales└ routes

シラサギ独特な構成• routes• addon• agents

Page 80: シラサギハンズオン 東京

/ – app├ models├ views └ controllers

└ config – locales└ routes

config/route.rbconfig/route/モジュール名/routes.rb

ブログページ作成 routes

Page 81: シラサギハンズオン 東京

/ – app├ models├ views └ controllers

└ config – locales└ routes

config/route.rbconfig/route/article/routes.rb

ブログページ作成 routes

Page 82: シラサギハンズオン 東京

/ – app├ models├ views └ controllers

└ config – locales└ routes

config/route.rbconfig/route/article/routes.rb

記事モジュール

SS::Application.routes.draw do…

content "article" doget "/" => redirect { |p, req| "#{req.path}/pages" }, as: :mainget "generate" => "generate#index“post "generate" => "generate#run“resources :pages, concerns: :deletion

end…

node "article" doget "page/(index.:format)" => "public#index", cell: "nodes/page“get "page/rss.xml" => "public#rss", cell: "nodes/page", format: "xml“

end

part "article" doget "page" => "public#index", cell: "parts/page"

end

page "article" doget "page/:filename.:format" => "public#index", cell: "pages/page“

endend

ブログページ作成 routes

Page 83: シラサギハンズオン 東京

/ – app├ models├ views └ controllers

└ config – locales└ routes

config/route.rbconfig/route/article/routes.rb

ルーティング追加ブロック管理画面 content 公開画面 node, page, part

SS::Application.routes.draw do…

content "article" doget "/" => redirect { |p, req| "#{req.path}/pages" }, as: :mainget "generate" => "generate#index“post "generate" => "generate#run“resources :pages, concerns: :deletion

end…

node "article" doget "page/(index.:format)" => "public#index", cell: "nodes/page“get "page/rss.xml" => "public#rss", cell: "nodes/page", format: "xml“

end

part "article" doget "page" => "public#index", cell: "parts/page"

end

page "article" doget "page/:filename.:format" => "public#index", cell: "pages/page“

endend

ブログページ作成 routes

Page 84: シラサギハンズオン 東京

ルーティングを確認してみます

#rake routes | grep article

ブログページ作成 routes

Page 85: シラサギハンズオン 東京

/ – app├ models├ views └ controllers

└ config – locales└ routes

config/route.rbconfig/route/article/routes.rb

ルーティング追加ブロック管理画面 content 公開画面 node, page, part

SS::Application.routes.draw do…

content "article" doget "/" => redirect { |p, req| "#{req.path}/pages" }, as: :mainget "generate" => "generate#index“post "generate" => "generate#run“resources :pages, concerns: :deletion

end…

node "article" doget "page/(index.:format)" => "public#index", cell: "nodes/page“get "page/rss.xml" => "public#rss", cell: "nodes/page", format: "xml“

end

part "article" doget "page" => "public#index", cell: "parts/page"

end

page "article" doget "page/:filename.:format" => "public#index", cell: "pages/page“

endend

cell: " pages/page " とは??

ブログページ作成 routes

Page 86: シラサギハンズオン 東京

ブログページ作成 agents

/ – app├ models├ views └ controllers

└ config – locales└ routes

シラサギ独特な構成• routes• addon• agents

Page 87: シラサギハンズオン 東京

• agents• コントローラーからコントローラーを呼び出す仕組み• シラサギ独自実装• lib/ss/agent.rb

• 利用箇所• 公開側のコントローラー (cms/public_controller)

公開側(利用者)のアクセスを各コンテンツに振り分ける例)http://ドメイン/docs/page.html → 記事ページ

http://ドメイン/calendar/ → イベントカレンダー

• ページ書き出し

ブログページ作成 agents

Page 88: シラサギハンズオン 東京

公開側ルーティング config/routes/cms/routes_end.rb#L73-78

※glob ルーティング(Route Globbing)

match "*public_path" => "cms/public#index", public_path: /[^\.].*/,via: [:get, :post, :put, :patch, :delete], format: true

match "*public_path" => "cms/public#index", public_path: /[^\.].*/,via: [:get, :post, :put, :patch, :delete], format: false

root "cms/public#index", defaults: { format: :html }

ブログページ作成 agents

Page 89: シラサギハンズオン 東京

公開側ルーティング config/routes/cms/routes_end.rb#L73-78

※glob ルーティング(Route Globbing)

公開画面"記事"にアクセスhttp://ドメイン/docs/page.html

match "*public_path" => "cms/public#index", public_path: /[^\.].*/,via: [:get, :post, :put, :patch, :delete], format: true

match "*public_path" => "cms/public#index", public_path: /[^\.].*/,via: [:get, :post, :put, :patch, :delete], format: false

root "cms/public#index", defaults: { format: :html }

ブログページ作成 agents

Page 90: シラサギハンズオン 東京

公開側ルーティング config/routes/cms/routes_end.rb#L73-78

※glob ルーティング(Route Globbing)

公開画面"記事"にアクセスhttp://ドメイン/docs/page.html

Controllercms/public#index

match "*public_path" => "cms/public#index", public_path: /[^\.].*/,via: [:get, :post, :put, :patch, :delete], format: true

match "*public_path" => "cms/public#index", public_path: /[^\.].*/,via: [:get, :post, :put, :patch, :delete], format: false

root "cms/public#index", defaults: { format: :html }

ブログページ作成 agents

Page 91: シラサギハンズオン 東京

公開側ルーティング config/routes/cms/routes_end.rb#L73-78

※glob ルーティング(Route Globbing)

公開画面"記事"にアクセスhttp://ドメイン/docs/page.html

Controllercms/public#index → agents

match "*public_path" => "cms/public#index", public_path: /[^\.].*/,via: [:get, :post, :put, :patch, :delete], format: true

match "*public_path" => "cms/public#index", public_path: /[^\.].*/,via: [:get, :post, :put, :patch, :delete], format: false

root "cms/public#index", defaults: { format: :html }

ブログページ作成 agents

Page 92: シラサギハンズオン 東京

公開側ルーティング config/routes/cms/routes_end.rb#L73-78

※glob ルーティング(Route Globbing)

公開画面"記事"にアクセスhttp://ドメイン/docs/page.html

Controllercms/public#index → agents → article/agents/pages/page_controller#index

match "*public_path" => "cms/public#index", public_path: /[^\.].*/,via: [:get, :post, :put, :patch, :delete], format: true

match "*public_path" => "cms/public#index", public_path: /[^\.].*/,via: [:get, :post, :put, :patch, :delete], format: false

root "cms/public#index", defaults: { format: :html }

ブログページ作成 agents

Page 93: シラサギハンズオン 東京

公開側ルーティング config/routes/cms/routes_end.rb#L73-78

※glob ルーティング(Route Globbing)

公開画面"記事"にアクセスhttp://ドメイン/docs/page.html

Controllercms/public#index → agents → article/agents/pages/page_controller#index

match "*public_path" => "cms/public#index", public_path: /[^\.].*/,via: [:get, :post, :put, :patch, :delete], format: true

match "*public_path" => "cms/public#index", public_path: /[^\.].*/,via: [:get, :post, :put, :patch, :delete], format: false

root "cms/public#index", defaults: { format: :html }

cell: " pages/page "

ブログページ作成 agents

Page 94: シラサギハンズオン 東京

ブログページ作成

/ – app├ models├ views └ controllers

└ config – locales└ routes

ブログモジュールを追加していきます。

Page 95: シラサギハンズオン 東京

ブログページ作成

/ – app├ models – blog├ views – blog└ controllers – blog

└ config – locales – blog└ routes – blog

ブログモジュールを追加していきます。

Page 96: シラサギハンズオン 東京

ブログページ作成

/ – app├ models – blog├ views – blog└ controllers – blog

└ config – locales – blog└ routes – blog

→ それぞれにソースコードを追加していきます。

Page 97: シラサギハンズオン 東京

ブログページ作成

/ – app├ models – blog├ views – blog└ controllers – blog

└ config – locales – blog└ routes – blog

→ それぞれにソースコードを追加していきます。手動でソースを追加するのは面倒…

#git checkout -b sample-blog-page origin/sample-blog-page#rake unicorn:stop#rake unicorn:start

Page 98: シラサギハンズオン 東京

ブログページ作成

Blog Page Model

/ – app├ models – blog – page.rb├ views – blog └ controllers – blog

└ config – locales – blog└ routes – blog

• include Cms::Page::Model• app/models/concerns/cms/node/model.rb

class Blog::Pageinclude Cms::Page::Modelinclude Cms::Addon::Metainclude Cms::Addon::Bodyinclude Cms::Addon::Fileinclude Cms::Addon::Releaseinclude Cms::Addon::RelatedPageinclude Category::Addon::Categoryinclude Workflow::Addon::Approver

before_save :seq_filename, if: ->{ basename.blank? } default_scope ->{ where(route: "blog/page") }

privatedef validate_filename

(@basename && @basename.blank?) ? nil : superend

def seq_filenameself.filename = dirname ? "#{dirname}#{id}.html" : "#{id}.html"

endend

Page 99: シラサギハンズオン 東京

ブログページ作成

Blog Page Model

/ – app├ models – blog – page.rb├ views – blog └ controllers – blog

└ config – locales – blog└ routes – blog

• 使用するAddonを追加• 本文、添付ファイル等々

class Blog::Pageinclude Cms::Page::Modelinclude Cms::Addon::Metainclude Cms::Addon::Bodyinclude Cms::Addon::Fileinclude Cms::Addon::Releaseinclude Cms::Addon::RelatedPageinclude Category::Addon::Categoryinclude Workflow::Addon::Approver

before_save :seq_filename, if: ->{ basename.blank? } default_scope ->{ where(route: "blog/page") }

privatedef validate_filename

(@basename && @basename.blank?) ? nil : superend

def seq_filenameself.filename = dirname ? "#{dirname}#{id}.html" : "#{id}.html"

endend

Addonをinclude

Page 100: シラサギハンズオン 東京

ブログページ作成

Blog Page Model

/ – app├ models – blog – page.rb├ views – blog └ controllers – blog

└ config – locales – blog└ routes – blog

• default_scopeを設定• field :route

• コンテンツを識別する値• “blog/page” → ブログ/ブログページ

class Blog::Pageinclude Cms::Page::Modelinclude Cms::Addon::Metainclude Cms::Addon::Bodyinclude Cms::Addon::Fileinclude Cms::Addon::Releaseinclude Cms::Addon::RelatedPageinclude Category::Addon::Categoryinclude Workflow::Addon::Approver

before_save :seq_filename, if: ->{ basename.blank? } default_scope ->{ where(route: "blog/page") }

privatedef validate_filename

(@basename && @basename.blank?) ? nil : superend

def seq_filenameself.filename = dirname ? "#{dirname}#{id}.html" : "#{id}.html"

endend

Addonをinclude

default_scoperoute: " blog/page "

Page 101: シラサギハンズオン 東京

ブログページ作成

Blog Page Initializer

/ – app├ models – blog – page.rb

└ initializer.rb├ views – blog└ controllers – blog

└ config – locales – blog└ routes – blog

• "blog/page" contentをpluginに登録

module Blogclass Initializer

Cms::Node.plugin "blog/page"end

end

Page 102: シラサギハンズオン 東京

ブログページ作成

Blog Page Agents View & Controller

/ – app├ models – blog – page.rb

└ initializer.rb├ views – blog – agents – pages – index.html.erb└ controllers – blog – agents – pages – page_controller.rb

└ config – locales – blog└ routes – blog

• ブログページ公開側• コントローラー• ビュー

• agentsの下に配置

class Blog::Agents::Pages::PageController < ApplicationControllerinclude Cms::PageFilter::View

end

<%= render file: "cms/agents/pages/page/index" %>

Page 103: シラサギハンズオン 東京

ブログページ作成

Blog Page Navi View

/ – app├ models – blog – page.rb

└ initializer.rb├ views – blog – agents – pages – index.html.erb

└ main – _navi.html.erb└ controllers – blog – agents – pages – page_controller.rb

└ config – locales – blog└ routes – blog

• ブログモジュールnavi viewを追加

<%= node_navi do %><nav class="sub-menu">

<header><h1><%=t"modules.blog" %></h1></header><div>

<%= link_to :"blog.page", blog_pages_path, class: "icon-page" %>

</div> </nav> <% end %>

Page 104: シラサギハンズオン 東京

ブログページ作成

Blog Page Controller

/ – app├ models – blog – page.rb

└ initializer.rb├ views – blog – agents – pages – index.html.erb

└ main – _navi.html.erb└ controllers – blog – agents – pages – page_controller.rb

└ pages_controller.rb└ config – locales – blog

└ routes – blog

• ブログページ管理側コントローラー

class Blog::PagesController < ApplicationControllerinclude Cms::BaseFilterinclude Cms::PageFilterinclude Workflow::PageFilter

model Blog::Page

append_view_path "app/views/cms/pages“navi_view "blog/main/navi“

privatedef fix_params

{ cur_user: @cur_user, cur_site: @cur_site, cur_node: @cur_node }

end

#public# Cms::PageFilter

end

Page 105: シラサギハンズオン 東京

ブログページ作成

Blog Page Controller

/ – app├ models – blog – page.rb

└ initializer.rb├ views – blog – agents – pages – index.html.erb

└ main – _navi.html.erb└ controllers – blog – agents – pages – page_controller.rb

└ pages_controller.rb└ config – locales – blog

└ routes – blog

• 必要なFilterをincludeします。• Index show new…

class Blog::PagesController < ApplicationControllerinclude Cms::BaseFilterinclude Cms::PageFilterinclude Workflow::PageFilter

model Blog::Page

append_view_path "app/views/cms/pages“navi_view "blog/main/navi“

privatedef fix_params

{ cur_user: @cur_user, cur_site: @cur_site, cur_node: @cur_node }

end

#public# Cms::PageFilter

end

Filterをinclude

Page 106: シラサギハンズオン 東京

ブログページ作成

Blog Config Locales

/ – app├ models – blog – page.rb

└ initializer.rb├ views – blog – agents – pages – index.html.erb

└ main – _navi.html.erb└ controllers – blog – agents – pages – page_controller.rb

└ pages_controller.rb└ config – locales – blog – ja.yml

└ routes – blog

• ブログモジュールのlocaleを追加

ja:blog:

page:ブログページ

modules:blog: ブログ

" blog/page "ブログ/ブログページ

Page 107: シラサギハンズオン 東京

ブログページ作成

Blog Page Routes

/ – app├ models – blog – page.rb

└ initializer.rb├ views – blog – agents – pages – index.html.erb

└ main – _navi.html.erb└ controllers – blog – agents – pages – page_controller.rb

└ pages_controller.rb└ config – locales – blog – ja.yml

└ routes – blog – routes.rb

• ブログモジュールのroutesを追加

SS::Application.routes.draw doBlog::Initializerconcern :deletion do

get :delete, on: :memberend

content "blog" doget “/” => redirect { |p, req| “#{req.path}/pages” },as: :main

resources :pages, concerns: :deletionend

page "blog" doget "page/:filename.:format" => "public#index", cell: "pages/page"

endend

Page 108: シラサギハンズオン 東京

ブログページ作成 確認

作成したブログページを使ってみます。

1. 適当なフォルダー下でモジュールをブログに切り替え2. 新規作成

→ ブログページが作成できます。

Page 109: シラサギハンズオン 東京

ブログページ作成

作成したブログページのMongoドキュメント(レコード)をチェックしてみます。

#mongo

Page 110: シラサギハンズオン 東京

ブログページ作成

作成したブログページのMongoドキュメント(レコード)をチェックしてみます。

#mongo#use ss_sample

Page 111: シラサギハンズオン 東京

ブログページ作成

作成したブログページのMongoドキュメント(レコード)をチェックしてみます。

#mongo#use ss_sample#db.cms_pages.find({route: "blog/page"})

Page 112: シラサギハンズオン 東京

ブログページ作成

作成したブログページのMongoドキュメント(レコード)をチェックしてみます。

#mongo#use ss_sample#db.cms_pages.find({route: "blog/page"}){

"_id" : 43,"permission_level" : 1,"group_ids" : [1],"state" : "public","order" : 0,"category_ids" : [ ],"file_ids" : [ ],"related_page_ids" : [ ],"route" : "blog/page",“name” : “ページサンプル",“layout_id” : 10, …

Page 113: シラサギハンズオン 東京

ブログページ作成

/ – app├ models – blog – page.rb

└ initializer.rb├ views – blog – agents – pages – index.html.erb

└ main – _navi.html.erb└ controllers – blog – agents – pages – page_controller.rb

└ pages_controller.rb└ config – locales – blog – ja.yml

└ routes – blog – routes.rb

Page 114: シラサギハンズオン 東京

ブログページ作成

ここまでで新しいページが作成できるようになりました。

しかし、これでは記事ページと変わらないので..

→ 入力フォームをカスタマイズします。#git checkout -b sample-blog-addon origin/sample-blog-addon#rake unicorn:restart

Page 115: シラサギハンズオン 東京

ハンズオン 目次

1. 開発サンプル紹介

2. 準備

3. ブログページ作成

4. 天気入力フォーム作成

5. 一覧フォルダー作成

Page 116: シラサギハンズオン 東京

天気入力フォーム作成

シラサギWiki:天気入力フォーム作成

Page 117: シラサギハンズオン 東京

天気入力フォーム作成

シラサギWiki:天気入力フォーム作成

※ページのアドオンを追加し入力フォームを追加します。

Page 118: シラサギハンズオン 東京

天気入力フォーム作成

シラサギWiki:天気入力フォーム作成

※公開側では入力した天気と日付を表示します。

Page 119: シラサギハンズオン 東京

天気入力フォーム作成

Blog Weather Addon

/ – app├ models – blog – addon.rb├ views – blog└ controllers – blog

└ config – locales – blog└ routes – blog

• 天気アドオンを追加

module Blog::Addonmodule Weather

extend ActiveSupport::Concernextend SS::Addon

set_order 190

included dofield :weather, type: Stringpermit_params :weather

publicdef weather_options

[ ["晴れ", "sunny"], ["曇り", "cloudy"],["雨", "rain"], ["雪", "snow"], ]

endend

endend

addonの表示順

fieldを定義

Page 120: シラサギハンズオン 東京

天気入力フォーム作成

Blog Page Model

/ – app├ models – blog – addon.rb

└ page.rb├ views – blog└ controllers – blog

└ config – locales – blog└ routes – blog

class Blog::Pageinclude Cms::Page::Modelinclude Cms::Addon::Metainclude Cms::Addon::Bodyinclude Cms::Addon::Fileinclude Cms::Addon::Releaseinclude Cms::Addon::RelatedPageinclude Category::Addon::Categoryinclude Workflow::Addon::Approverinclude Blog::Addon::Weather

before_save :seq_filename, if: ->{ basename.blank? } default_scope ->{ where(route: "blog/page") }

privatedef validate_filename

(@basename && @basename.blank?) ? nil : superend

def seq_filenameself.filename = dirname ? "#{dirname}#{id}.html" : "#{id}.html"

endend

Include Weather Addon

Page 121: シラサギハンズオン 東京

天気入力フォーム作成

Blog Weather Addon Index View

/ – app├ models – blog – addon.rb

└ page.rb├ views – blog – addons – weather – _form.html.erb

├ _show.html.rb└ controllers – blog └ index.html.erb

└ config – locales – blog└ routes – blog

• アドオンのviewを作成

Page 122: シラサギハンズオン 東京

天気入力フォーム作成

Blog Weather Addon Index View

/ – app├ models – blog – addon.rb

└ page.rb├ views – blog – addons – weather – _form.html.erb

├ _show.html.rb└ controllers – blog └ index.html.erb

└ config – locales – blog└ routes – blog

• アドオンのviewを作成

管理画面入力フォーム

管理画面表示

公開画面表示

Page 123: シラサギハンズオン 東京

天気入力フォーム作成

Blog Config Locales

/ – app├ models – blog – addon.rb

└ page.rb├ views – blog – addons – weather – _form.html.erb

├ _show.html.rb└ controllers – blog └ index.html.erb

└ config – locales – blog – ja.yml└ routes – blog

• localeを追記

ja:blog:

page:ブログページsunny:☀cloudy: ☁rain: ☂snow: ☃

modules:blog: ブログaddons:

blog/weather: 今日の天気

mongoid:attributes:

cms/page/model: weather:天気

Page 124: シラサギハンズオン 東京

天気入力フォーム作成

管理画面から"今日の天気"を入力してみます

Page 125: シラサギハンズオン 東京

天気入力フォーム作成

/ – app├ models – blog – addon.rb

└ page.rb├ views – blog – addons – weather – _form.html.erb

├ _show.html.rb└ controllers – blog └ index.html.erb

└ config – locales – blog – ja.yml└ routes – blog

Page 126: シラサギハンズオン 東京

天気入力フォーム作成 練習

1. 天気マークを追加してみてください (雷注意報、にわか雨、お花見日和…

2. 別の入力フォームを作ってみてください (別のアドオンを作成

3. 修正したコードをローカルでcommitしてみてください (おまけ

Page 127: シラサギハンズオン 東京

天気入力フォーム作成

独自の入力フォームを作成しました。最後にフォルダーの作成を説明します。

#git checkout -b sample-blog-node origin/sample-blog-node#rake unicorn:restart

Page 128: シラサギハンズオン 東京

ハンズオン 目次

1. 開発サンプル紹介

2. 準備

3. ブログページ作成

4. 天気入力フォーム作成

5. 一覧フォルダー作成

Page 129: シラサギハンズオン 東京

一覧フォルダー作成

シラサギWiki:一覧フォルダー作成

Page 130: シラサギハンズオン 東京

一覧フォルダー作成

※「フォルダー属性」ブログページリストが作成できるようになります

シラサギWiki:一覧フォルダー作成

Page 131: シラサギハンズオン 東京

一覧フォルダー作成

※公開側のページ一覧を変更し独自のものを作成します

シラサギWiki:一覧フォルダー作成

Page 132: シラサギハンズオン 東京

一覧フォルダー作成

Blog Node Model

/ – app├ models – blog – node.rb├ views – blog└ controllers – blog

└ config – locales – blog└ routes – blog

• ブログ一覧フォルダーを作成

module Blog::Nodeclass Base

include Cms::Node::Model

default_scope ->{ where(route: /^blog\//) }end

class Pageinclude Cms::Node::Modelinclude Cms::Addon::PageList

default_scope ->{ where(route: "blog/page") } end

end

Page 133: シラサギハンズオン 東京

一覧フォルダー作成

Blog Agents Nodes/Page Controller

/ – app├ models – blog – node.rb├ views – blog – agents – nodes – page – index.html.erb└ controllers – blog – agents – nodes – page_controller.rb

└ config – locales – blog└ routes – blog

• 公開側コントローラー、一覧ビューを作成• agents/nodes/page

Page 134: シラサギハンズオン 東京

一覧フォルダー作成

Blog Agents Nodes/Page Controller

/ – app├ models – blog – node.rb├ views – blog – agents – nodes – page – index.html.erb└ controllers – blog – agents – nodes – page_controller.rb

└ config – locales – blog└ routes – blog

• 公開側コントローラー、一覧ビューを作成• agents/nodes/page

class Blog::Agents::Nodes::PageController < ApplicationControllerinclude Cms::NodeFilter::Viewhelper Cms::ListHelper

Publicdef pages

Blog::Page.site(@cur_site).public(@cur_date). where(@cur_node.condition_hash)

end

def index@items = pages.

order_by(@cur_node.sort_hash). page(params[:page]). per(@cur_node.limit)

render_with_pagination @itemsend

end

Page 135: シラサギハンズオン 東京

一覧フォルダー作成

Blog Config Locales

/ – app├ models – blog – node.rb├ views – blog – agents – nodes – page – index.html.erb└ controllers – blog – agents – nodes – page_controller.rb

└ config – locales – blog – ja.yml└ routes – blog

• localeに追記

ja:…

cms:nodes:

blog/page: ブログページリスト…

Page 136: シラサギハンズオン 東京

一覧フォルダー作成

Blog Config Locales

/ – app├ models – blog – node.rb├ views – blog – agents – nodes – page – index.html.erb└ controllers – blog – agents – nodes – page_controller.rb

└ config – locales – blog – ja.yml└ routes – blog – routes.rb

• routesにnodeを追記

SS::Application.routes.draw do…

node "blog" doget "page/(index.:format)" => "public#index", cell: "nodes/page "

end…end

Page 137: シラサギハンズオン 東京

一覧フォルダー作成

/ – app├ models – blog – node.rb├ views – blog – agents – nodes – page – index.html.erb└ controllers – blog – agents – nodes – page_controller.rb

└ config – locales – blog – ja.yml└ routes – blog – routes.rb

Page 138: シラサギハンズオン 東京

一覧フォルダー作成

管理画面から一覧フォルダーを作成してみます

Page 139: シラサギハンズオン 東京

まとめ

• 新しいページ、アドオン、フォルダーを作りました

• 既存のコードを変更せずにコンテンツを追加できます

Page 140: シラサギハンズオン 東京

最後に

長い時間ありがとうございました!是非SHIRASAGIをカスタマイズしてみてください!