FrontPage  Index  Search  Changes  Login

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 なので、そこにアクセスすると以下のよ うな画面になります。

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>
Last modified:2005/11/27 18:40:39
Keyword(s):
References:[RailsでWikiクローンを作る]