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
…
92. ブログページ作成
/ – app
├ models – blog
├ views – blog
└ controllers – blog
└ config – locales – blog
└ routes – blog
ブログモジュールを追加していきます。
93. ブログページ作成
/ – app
├ models – blog
├ views – blog
└ controllers – blog
└ config – locales – blog
└ routes – blog
→ それぞれにソースコードを追加していきます。
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
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"
end
end
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"
end
end
Addonをinclude
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"
end
end
Addonをinclude
default_scope
route: " blog/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"
end
end
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" %>
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 %>
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::PageFilter
end
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::PageFilter
end
Filterをinclude
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 "
ブログ/ブログページ
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"
end
end
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を定義
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"
end
end
Include Weather Addon
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を作成
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を作成
管理画面入力フォーム
管理画面表示
公開画面表示
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") }
end
end
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
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
end
end
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: ブログページリスト
…
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
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