« RailsでWikiクローンを作る | メイン | Wiki新設 »

2005年09月06日

RailsでWikiクローンを作る 11: 管理画面

管理画面: DBとモデル
Wikiコントローラからしばらく離れて、管理画面関連の実装を行います。 全体的に、既出の事柄が多いので、さらっと流します。 管理画面の内容は、おおざっぱに以下のようになります。 まず設定情報を保持するデータベースのテーブル 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 を書き換えます。 主な修正内容は以下の通り:
<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>

投稿者 tam : 2005年09月06日 18:39

トラックバック

このエントリーのトラックバックURL:
http://tam.qmix.org/mt3/mt-tb.cgi/18

このリストは、次のエントリーを参照しています: RailsでWikiクローンを作る 11: 管理画面:

» blowjob cum gallery from blowjob cum gallery
[続きを読む]

トラックバック時刻: 2007年04月07日 05:50

» s b c from s b c
[続きを読む]

トラックバック時刻: 2007年04月10日 03:51

» sugar free german chocolate cake recipe from sugar free german chocolate cake recipe
[続きを読む]

トラックバック時刻: 2007年04月10日 09:34

» food lasagna network recipe from food lasagna network recipe
[続きを読む]

トラックバック時刻: 2007年04月14日 04:08

» bedroom pics threesome from bedroom pics threesome
[続きを読む]

トラックバック時刻: 2007年04月22日 13:10

» girls ass licking boys from girls ass licking boys
[続きを読む]

トラックバック時刻: 2007年04月23日 15:00

» kobe tai mpeg from kobe tai mpeg
[続きを読む]

トラックバック時刻: 2007年04月24日 00:12

» videos of naked lesbisn women with big boobs from videos of naked lesbisn women with big boobs
[続きを読む]

トラックバック時刻: 2007年04月25日 02:08

コメント

コメントしてください




保存しますか?