RailsでWikiクローンを作る09
管理画面
管理画面: DBとモデル
Wikiコントローラからしばらく離れて、管理画面関連の実装を行います。全体 的に、既出の事柄が多いので、さらっと流します。管理画面の内容は、おおざっ ぱに以下のようになります。
- 設定保存用DBテーブルconfsを新たに作る。confsの中身は1行だけ。
- confsに対応するモデル Conf も作る。
- 管理画面用コントローラとしてあらたにAdminコントローラを作る。
- 管理の中の各種設定ページをアクションとして実装する。
まず設定情報を保持するデータベースのテーブル confs を作成します。テー ブルといっても、このテーブルは行が一行しかありません。わざわざDBに格納 する必要もないくらいのデータですが、RailsではDBにデータを入れておいた 方が何かと便利なので、DBに格納することにします。なお、設定項目は Hiki を参考にしつつ、最低限のものだけにしています。
また、テーブルを作るときに、同時に適当な初期値を与えます。 sqlite3 用 のスキーマは以下のようになります。
-- conf
create table confs (
id integer primary key,
site_name varchar(255) not null,
author_name varchar(255),
theme varchar(255),
use_wikiname boolean
);
insert into confs (site_name, author_name, theme, use_wikiname, use_plugin)
values ('hoge hoge', '名無しさん', 'hiki', 'true', 'false');
続いて、対応するモデルを generate コマンドで生成します。
% ruby script/generate model Conf
exists app/models/
exists test/unit/
exists test/fixtures/
create app/models/conf.rb
create test/unit/conf_test.rb
create test/fixtures/confs.yml
管理画面: コントローラとビュー
管理画面用に、新たに Adminコントローラを作ることにします。 Hikiになら い、管理画面にはとりあえず「基本」という設定画面を作りたいので、同時に basicアクションも生成します。
% ruby script/generate controller Admin basic
exists app/controllers/
exists app/helpers/
create app/views/admin
exists test/functional/
create app/controllers/admin_controller.rb
create test/functional/admin_controller_test.rb
create app/helpers/admin_helper.rb
create app/views/admin/basic.rhtml
続いて、生成された app/controllers/admin_controller.rb を以下のように 修正します。
class AdminController < ApplicationController
layout 'wiki'
def basic
@conf = Conf.find 1
if request.post?
@conf.update_attributes(params[:conf])
if @conf.save
flash[:notice] = "保存されました。"
redirect_to :action => 'basic'
end
end
end
end
AdminコントローラではWikiコントローラ用に作ったレイアウトファイルを流 用することにします。名前付け規約により、デフォルトではコントローラ名か らレイアウトファイル名が決定されますが、layout 'wiki' のようにコントロー ラ内で明示的にレイアウトファイル名を指定することもできます。なお、既出 のレイアウトファイル app/views/layouts/wiki.rhtml では、link_to でコン トローラ名がwikiであることを仮定している部分があるので、明示的にコント ローラ名を指定するように変更する必要があります(後述)。
basicアクションは、今までと違い、ひとつのメソッドでフォームの画面表示 と保存を行うようにしています。 request.post? で、そのアクションが POST メソッドで呼ばれたのか、それ以外(GET メソッド)で呼ばれたのかわかるので、 GET メソッドの場合はフォーム画面を表示するだけ、POSTメソッドの場合は設 定を保存して flash で「保存されました」というメッセージを表示するよう にしています。
なお、Conf.find の第一引数は、今までは :all を指定していましたが、テー ブルの id 番号を指定することもできます。 Conf には id == 1 の行が1行だ け存在するので、決め打ちで Conf.find 1 と指定しています。
basicアクションのビューテンプレート(app/views/admin/basic.rhtml)は、以 下のようになります。この中で、select はselectタグを生成するヘルパーメ ソッドです。詳しくは http://api.rubyonrails.com/classes/ActionView/Helpers/FormOptionsHelper.htmlを参照してください。
<% @title = "基本設定" %> <%= error_messages_for 'conf' %> <%if flash[:notice] %> <p style="margin-left: 2em; color: green"><%= flash[:notice] %></p> <% end %> <%= start_form_tag :action => 'basic' %> <div class="body"> <p>サイト名<br/> <%= text_field 'conf', 'site_name' %></p> <p>著者名<br/> <%= text_field 'conf', 'author_name' %></p> <p>テーマ<br/> <%= text_field 'conf', 'theme' %></p> <p>WikiNameによるリンク機能の利用<br/> <%= select 'conf', 'use_wikiname', [['true', true], ['false', false]] %></p> <%= submit_tag "Update" %> </div> <%= end_form_tag %>
Adminコントローラの basic アクションの URL は、 http://localhost:3000/admin/basic なので、そこにアクセスすると以下のよ うな画面になります。

設定値の反映
設定値を保存・編集できるようになったので、それをwiki画面に反映させます。 まずは、以前 wiki コントローラ app/controllers/wiki_controller.rb の show メソッドで、ダミーの conf オブジェクトを使用していた部分を以下の ように書き換えます。
変更前:
conf = Struct.new(:use_plugin, :use_wikiname).new(false, false)
変更後:
conf = Conf.find 1
これで、ページ表示のときに設定値が反映されるようになります (といっても、 WikiName によるリンク機能の利用を on/off できるくらいですが)。
続いてページ表示に、基本設定で設定したサイト名やテーマを反映させるため、 レイアウトファイル app/views/layouts/wiki.rhtml を書き換えます。 主な 修正内容は以下の通り:
- wiki, adminの両コントローラでレイアウトを共用するため、link_to で :controller を明示指定
- title タグに site_name を入れる
- テーマに応じてスタイルシートのパスを変える
- フッタをつくって author_name を表示するようにする
<html>
<% conf = Conf.find 1 %>
<head>
<title><%= conf.site_name %>: <%= @title %></title>
<%= stylesheet_link_tag '/theme/hiki_base.css' %>
<%= stylesheet_link_tag "/theme/#{conf.theme}/#{conf.theme}" %>
</head>
<body>
<a name="top"></a>
<div class="main">
<div class="adminmenu">
<span class="adminmenu"><%= link_to '新規作成', :controller => 'wiki', :action => 'new' %></span>
<% if controller.controller_name == 'wiki' and controller.action_name == 'show'%>
<span class="adminmenu"><%= link_to '編集', :controller => 'wiki', :action => 'edit', :id => @page.name %></span>
<% end %>
<span class="adminmenu"><%= link_to 'FrontPage', :controller => 'wiki', :action => 'show', :id => 'FrontPage' %></span>
<span class="adminmenu"><%= link_to '一覧', :controller => 'wiki', :action => 'list' %></span>
<span class="adminmenu"><%= link_to '管理', :controller => 'admin', :action => 'basic' %></span>
</div>
<h1 class="header"><%= @title %></h1>
<div class="day">
<%= @content_for_layout %>
</div>
</div>
<div class="sidebar">
</div>
<div class="footer">Founded by <%= conf.author_name %>.<br></div>
</body>
</html>

Keyword(s):
References:[RailsでWikiクローンを作る]