Top Banner
Ruby/Rails/mongoDB でででででで でででででででで CMS ででででででででででで 「」
137

シラサギハンズオン 大阪

Jul 25, 2015

Download

Technology

Yu Ito
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: シラサギハンズオン 大阪

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

Page 2: シラサギハンズオン 大阪

登壇者

ウェブチップス1. 野原2. 中野3. 伊藤

nakano
全体の目次がいる。
Page 3: シラサギハンズオン 大阪

ハンズオンの狙い

1. シラサギの概要を理解する。2. シラサギの仕組みを理解する。3. シラサギの機能追加と機能拡張の方法を理解する。

nakano
全体の目次がいる。ハンズオン募集ページとの整合性確認。
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. シラサギの機能追加と機能拡張の方法を理解する。

nakano
全体の目次がいる。ハンズオン募集ページとの整合性確認。
Page 27: シラサギハンズオン 大阪

導入

管理画面1. メニューやコンテキストメニューの操作方法2. フォルダ3. レイアウト4. パーツ5. ページ6. アドオン

nakano
全体の目次がいる。ハンズオン募集ページとの整合性確認。
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::Page include Cms::Page::Model include Cms::Addon::Meta include Cms::Addon::Body include Cms::Addon::File include Cms::Addon::Release include Cms::Addon::ReleasePlan include Cms::Addon::RelatedPage include Category::Addon::Category include Event::Addon::Date include Map::Addon::Page include Workflow::Addon::Approver include Contact::Addon::Page include 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 インストール

■VirtualBoxhttps://www.virtualbox.org/wiki/Downloads

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

■Vagranthttps://www.vagrantup.com/downloads.html

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

Page 44: シラサギハンズオン 大阪

Windows の方だけ

■Githttps://msysgit.github.io/

Googleで「 windows git」を検索しても OK

■Tera Termhttp://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: シラサギハンズオン 大阪

シラサギハンズオン

nakano
目次がほしいい。「?ページ参照」や「?ページのこと」という説明がしやすく、あとで振り返りやすい。
Page 50: シラサギハンズオン 大阪

ハンズオン 目次

1. 開発サンプル紹介2. 準備3. ブログページ作成4. 天気入力フォーム作成5. 一覧フォルダー作成

Page 54: シラサギハンズオン 大阪

開発サンプル 紹介

シラサギWiki:開発サンプルブログページ今回の開発の流れ

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

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

3. フォルダーの追加  作成したページ用一覧フォルダーの追加を行います  新しいタイプのフォルダー作成ができるようになります

Page 55: シラサギハンズオン 大阪

ハンズオン 目次

1. 開発サンプル紹介2. 準備3. ブログページ作成4. 天気入力フォーム作成5. 一覧フォルダー作成

Page 56: シラサギハンズオン 大阪

準備  Gitとソースコード

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

#cd /var/www#git clone https://github.com/itowtips/ss-handson  sample#cd sample

Page 57: シラサギハンズオン 大阪

準備  Gitとソースコード

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

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

Page 58: シラサギハンズオン 大阪

準備  Gitとソースコード

bundle install

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

Page 59: シラサギハンズオン 大阪

準備 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 60: シラサギハンズオン 大阪

準備 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 61: シラサギハンズオン 大阪

準備  RAILS_ENV

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

Railsを developmentモードに

Page 62: シラサギハンズオン 大阪

準備  RAILS_ENV

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

Railsを developmentモードに

Page 63: シラサギハンズオン 大阪

準備 サンプルデータ

#rake db:create_indexes

MongoDB インデックス作成

Page 64: シラサギハンズオン 大阪

準備 サンプルデータ

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

システム管理者作成

Page 65: シラサギハンズオン 大阪

準備 サンプルデータ

#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 66: シラサギハンズオン 大阪

準備 サンプルデータ

#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 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" }'#rake db:seed name=users site=www#rake db:seed name=demo site=www

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

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#rake db:seed name=demo site=www#rake unicorn:start

unicorn 起動

Page 69: シラサギハンズオン 大阪

準備 確認

http://ドメイン :3000/

Page 70: シラサギハンズオン 大阪

ハンズオン 目次

1. 開発サンプル紹介2. 準備3. ブログページ作成4. 天気入力フォーム作成5. 一覧フォルダー作成

Page 74: シラサギハンズオン 大阪

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

/ – app ├ models ├ views └ controllers └ config – locales       └ routes ソースコードをエディタで開いてみてください

Page 75: シラサギハンズオン 大阪

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

/ – app ├ models ├ views └ controllers └ config – locales       └ routes シラサギ独特な構成

• routes• agents

Page 76: シラサギハンズオン 大阪

ブログページ作成  routes

/ – app ├ models ├ views └ controllers └ config – locales       └ routes シラサギ独特な構成

• routes• agents

Page 77: シラサギハンズオン 大阪

/ – app ├ models ├ views └ controllers └ config – locales       └ routes

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

ブログページ作成  routes

Page 78: シラサギハンズオン 大阪

/ – app ├ models ├ views └ controllers └ config – locales       └ routes

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

ブログページ作成  routes

Page 79: シラサギハンズオン 大阪

/ – app ├ models ├ views └ controllers └ config – locales       └ routes

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

記事モジュール

SS::Application.routes.draw do …  content "article" do   get  "/" => redirect { |p, req| "#{req.path}/pages" }, as: :main    get "generate" => "generate#index“   post "generate" => "generate#run“   resources :pages, concerns: :deletion  end …  node "article" do    get "page/(index.:format)" => "public#index", cell: "nodes/page“   get "page/rss.xml" => "public#rss", cell: "nodes/page", format: "xml“  end

  part "article" do    get "page" => "public#index", cell: "parts/page"   end

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

ブログページ作成  routes

Page 80: シラサギハンズオン 大阪

/ – 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" do   get  "/" => redirect { |p, req| "#{req.path}/pages" }, as: :main    get "generate" => "generate#index“   post "generate" => "generate#run“   resources :pages, concerns: :deletion  end …  node "article" do    get "page/(index.:format)" => "public#index", cell: "nodes/page“   get "page/rss.xml" => "public#rss", cell: "nodes/page", format: "xml“  end

  part "article" do    get "page" => "public#index", cell: "parts/page"   end

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

ブログページ作成  routes

Page 81: シラサギハンズオン 大阪

ルーティングを確認してみます  #rake routes | grep article

ブログページ作成  routes

Page 82: シラサギハンズオン 大阪

/ – 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" do   get  "/" => redirect { |p, req| "#{req.path}/pages" }, as: :main    get "generate" => "generate#index“   post "generate" => "generate#run“   resources :pages, concerns: :deletion  end …  node "article" do    get "page/(index.:format)" => "public#index", cell: "nodes/page“   get "page/rss.xml" => "public#rss", cell: "nodes/page", format: "xml“  end

  part "article" do    get "page" => "public#index", cell: "parts/page"   end

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

cell: " pages/page " とは ??

ブログページ作成  routes

Page 83: シラサギハンズオン 大阪

ブログページ作成  agents

/ – app ├ models ├ views └ controllers └ config – locales       └ routes

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

Page 84: シラサギハンズオン 大阪

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

• 利用箇所• 公開側のコントローラー  cms/public_controller• ページ書き出し

ブログページ作成  agents

Page 85: シラサギハンズオン 大阪

公開側ルーティング 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: falseroot "cms/public#index", defaults: { format: :html }

ブログページ作成  agents

Page 86: シラサギハンズオン 大阪

公開側ルーティング 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: falseroot "cms/public#index", defaults: { format: :html }

ブログページ作成  agents

Page 87: シラサギハンズオン 大阪

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

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

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

Controller  cms/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: falseroot "cms/public#index", defaults: { format: :html }

ブログページ作成  agents

Page 88: シラサギハンズオン 大阪

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

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

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

Controller  cms/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: falseroot "cms/public#index", defaults: { format: :html }

ブログページ作成  agents

Page 89: シラサギハンズオン 大阪

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

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

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

Controller  cms/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: falseroot "cms/public#index", defaults: { format: :html }

ブログページ作成  agents

Page 90: シラサギハンズオン 大阪

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

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

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

Controller  cms/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: falseroot "cms/public#index", defaults: { format: :html }

cell: " pages/page "

ブログページ作成  agents

Page 91: シラサギハンズオン 大阪

ブログページ作成

/ – app ├ models ├ views └ controllers └ config – locales       └ routes ブログモジュールを追加していきます。

Page 92: シラサギハンズオン 大阪

ブログページ作成

/ – app ├ models – blog ├ views    – blog └ controllers – blog └ config – locales – blog       └ routes – blog

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

  

Page 93: シラサギハンズオン 大阪

ブログページ作成

/ – app ├ models – blog ├ views    – blog └ controllers – blog └ config – locales – blog       └ routes – blog

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

Page 94: シラサギハンズオン 大阪

ブログページ作成

/ – 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 95: シラサギハンズオン 大阪

ブログページ作成

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::Page   include Cms::Page::Model   include Cms::Addon::Meta   include Cms::Addon::Body   include Cms::Addon::File   include Cms::Addon::Release   include Cms::Addon::RelatedPage  include Category::Addon::Category   include Workflow::Addon::Approver

  before_save :seq_filename, if: ->{ basename.blank? }       default_scope ->{ where(route: "blog/page") }   private    def validate_filename     (@basename && @basename.blank?) ? nil : super   end

   def seq_filename    self.filename = dirname ? "#{dirname}#{id}.html" : "#{id}.html"    endend

Page 96: シラサギハンズオン 大阪

ブログページ作成

Blog Page Model

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

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

class Blog::Page   include Cms::Page::Model   include Cms::Addon::Meta   include Cms::Addon::Body   include Cms::Addon::File   include Cms::Addon::Release   include Cms::Addon::RelatedPage  include Category::Addon::Category   include Workflow::Addon::Approver

  before_save :seq_filename, if: ->{ basename.blank? }       default_scope ->{ where(route: "blog/page") }   private    def validate_filename     (@basename && @basename.blank?) ? nil : super   end

   def seq_filename    self.filename = dirname ? "#{dirname}#{id}.html" : "#{id}.html"    endend

Addonを include

Page 97: シラサギハンズオン 大阪

ブログページ作成

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::Page   include Cms::Page::Model   include Cms::Addon::Meta   include Cms::Addon::Body   include Cms::Addon::File   include Cms::Addon::Release   include Cms::Addon::RelatedPage  include Category::Addon::Category   include Workflow::Addon::Approver

  before_save :seq_filename, if: ->{ basename.blank? }       default_scope ->{ where(route: "blog/page") }   private    def validate_filename     (@basename && @basename.blank?) ? nil : super   end

   def seq_filename    self.filename = dirname ? "#{dirname}#{id}.html" : "#{id}.html"    endend

Addonを include

default_scoperoute: " blog/page "

Page 98: シラサギハンズオン 大阪

ブログページ作成

Blog Page Initializer

/ – app ├ models – blog – page.rb       └ initializer.rb ├ views – blog └ controllers – blog └ config – locales – blog      └ routes – blog

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

module Blog   class Initializer    Cms::Node.plugin "blog/page"   endend

Page 99: シラサギハンズオン 大阪

ブログページ作成

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 < ApplicationController   include Cms::PageFilter::View end

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

Page 100: シラサギハンズオン 大阪

ブログページ作成

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 101: シラサギハンズオン 大阪

ブログページ作成

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 < ApplicationController   include Cms::BaseFilter  include Cms::PageFilter  include Workflow::PageFilter

 model Blog::Page

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

  private    def fix_params    { cur_user: @cur_user, cur_site: @cur_site,      cur_node: @cur_node }    end

  #public   # Cms::PageFilterend

Page 102: シラサギハンズオン 大阪

ブログページ作成

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 < ApplicationController   include Cms::BaseFilter  include Cms::PageFilter  include Workflow::PageFilter

 model Blog::Page

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

  private    def fix_params    { cur_user: @cur_user, cur_site: @cur_site,      cur_node: @cur_node }    end

  #public   # Cms::PageFilterend

Filterをinclude

Page 103: シラサギハンズオン 大阪

ブログページ作成

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 104: シラサギハンズオン 大阪

ブログページ作成

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 do  Blog::Initializer   concern :deletion do   get :delete, on: :member  end

  content "blog" do   get “/” => redirect { |p, req| “#{req.path}/pages” },    as: :main    resources :pages, concerns: :deletion   end

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

Page 105: シラサギハンズオン 大阪

ブログページ作成 確認

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

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

Page 106: シラサギハンズオン 大阪

ブログページ作成

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

 

#mongo

Page 107: シラサギハンズオン 大阪

ブログページ作成

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

 

#mongo#use ss_sample

Page 108: シラサギハンズオン 大阪

ブログページ作成

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

 

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

Page 109: シラサギハンズオン 大阪

ブログページ作成

作成したブログページの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 110: シラサギハンズオン 大阪

ブログページ作成

/ – 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 111: シラサギハンズオン 大阪

ブログページ作成

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

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

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

Page 112: シラサギハンズオン 大阪

ハンズオン 目次

1. 開発サンプル紹介2. 準備3. ブログページ作成4. 天気入力フォーム作成5. 一覧フォルダー作成

Page 116: シラサギハンズオン 大阪

天気入力フォーム作成

Blog Weather Addon

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

• 天気アドオンを追加

module Blog::Addon  module Weather    extend ActiveSupport::Concern    extend SS::Addon

   set_order 190

   included do     field :weather, type: String       permit_params :weather

    public      def weather_options      [ [" 晴れ ", "sunny"], [" 曇り ", "cloudy"],       [" 雨 ", "rain"], [" 雪 ", "snow"], ]      end    end   end end

addonの表示順

fieldを定義

Page 117: シラサギハンズオン 大阪

天気入力フォーム作成

Blog Page Model

/ – app ├ models – blog – addon.rb                └ page.rb ├ views    – blog └ controllers – blog └ config – locales – blog       └ routes – blog

class Blog::Page   include Cms::Page::Model   include Cms::Addon::Meta   include Cms::Addon::Body   include Cms::Addon::File   include Cms::Addon::Release   include Cms::Addon::RelatedPage  include Category::Addon::Category   include Workflow::Addon::Approver  include Blog::Addon::Weather

  before_save :seq_filename, if: ->{ basename.blank? }       default_scope ->{ where(route: "blog/page") }   private    def validate_filename     (@basename && @basename.blank?) ? nil : super   end

   def seq_filename    self.filename = dirname ? "#{dirname}#{id}.html" : "#{id}.html"    endend

Include Weather Addon

Page 118: シラサギハンズオン 大阪

天気入力フォーム作成

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 119: シラサギハンズオン 大阪

天気入力フォーム作成

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 120: シラサギハンズオン 大阪

天気入力フォーム作成

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 121: シラサギハンズオン 大阪

天気入力フォーム作成

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

Page 122: シラサギハンズオン 大阪

天気入力フォーム作成

/ – 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 123: シラサギハンズオン 大阪

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

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

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

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

Page 124: シラサギハンズオン 大阪

天気入力フォーム作成

独自の入力フォームを作成しました。最後にフォルダーの作成を説明します。#git checkout -b sample-blog-node origin/sample-blog-node#rake unicorn:restart

Page 125: シラサギハンズオン 大阪

ハンズオン 目次

1. 開発サンプル紹介2. 準備3. ブログページ作成4. 天気入力フォーム作成5. 一覧フォルダー作成

Page 129: シラサギハンズオン 大阪

一覧フォルダー作成

Blog Node Model

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

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

module Blog::Node   class Base   include Cms::Node::Model

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

  class Page include Cms::Node::Model    include Cms::Addon::PageList

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

Page 130: シラサギハンズオン 大阪

一覧フォルダー作成

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 131: シラサギハンズオン 大阪

一覧フォルダー作成

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 < ApplicationController   include Cms::NodeFilter::View  helper Cms::ListHelper

Public  def 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 @items   endend

Page 132: シラサギハンズオン 大阪

一覧フォルダー作成

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 133: シラサギハンズオン 大阪

一覧フォルダー作成

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" do   get "page/(index.:format)" => "public#index",    cell: "nodes/page "  end…end

Page 134: シラサギハンズオン 大阪

一覧フォルダー作成

/ – 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 135: シラサギハンズオン 大阪

一覧フォルダー作成

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

Page 136: シラサギハンズオン 大阪

まとめ

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

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

Page 137: シラサギハンズオン 大阪

最後に

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