目次

apache_edit_conf

本サンプルは、典型的な設定ファイルの編集画面のサンプルです。

画面で登録した内容を以下のような キー=値 が1行ずつ並んだ形式のファイルに出力します。

data/test.conf
foo="100"
bar="200"
baz="300"

コントローラ(main.rb)内のメソッド

initialize

複数のアクションで使用するAlFormオブジェクトの生成と、データ永続化を行うAlPersistクラスのサブクラスAlPersistShの生成を行っています。

AlFormの扱いについてはmailformサンプルの解説とapache_htpasswdサンプルの解説をご覧ください。

AlPersistのサブクラスはデータの永続化を行います。本サンプルではUNIX系OSのシェルスクリプト形式で永続化を行うAlPersistShを使用しています。このほか、データベースに対応したAlPersistMysql, AlPersistPostgres, AlPersistSqliteなども用意されています。

action_index

URLにアクション名を指定しなかったときに使用されるデフォルトアクションです。登録ユーザーの一覧表示を行います。

AlPersistShオブジェクトを使用して、設定ファイルからキーと値のペアの一覧を読み込んだ後に、テンプレートlist.rhtmlを処理しています。

action_create

新規登録画面を表示します。

action_submit

フォームから送られたキーと値の組をAlPersistShオブジェクトを使用してファイルに登録します。

    @result = @persist.create( { @form.values[:key] => @form.values[:value] } )

action_update

指定されたキーの編集画面を表示します。

画面表示に先立ち編集対象のキーの情報が必要なので、AlForm#validateを呼び出しています。AlForm#validateはAlForm#fetch_requestでフォームの値を取得した後に呼び出すのが基本ですが、fetch_requestメソッドを呼び出さずにvalidateメソッドを呼び出すと、validateメソッドの内部で自動的にfetch_requestメソッドが呼ばれます。action_update内でも、validateメソッドを単独で呼び出しています。

    raise "Primary key is not given."  if ! @form.validate( :key )

フォームからキーが取得できたら、AlPersistShオブジェクトを使って設定ファイルの内容を読み取り、フォームにデフォルト表示する値をウィジェットにセットしています。なお、編集画面で書き換えを行うのは値のみでありキーを書き換えることはありえないので、キーに対応するウィジェットにはreadonly属性をセットしています。set_attrでセットした属性は、HTML生成時にHTMLタグの属性として出力されます。

    @persist.read()
    @form.widgets[:value].set_value( @persist[ @form.values[:key] ] )
    @form.widgets[:key].set_attr( :readonly=>'readonly' )
 
    AlTemplate.run( @template_update || "#{AL_BASEDIR}/templates/form.rhtml" )

action_update_submit

編集画面から送信されたフォームを解析し、AlPersistShオブジェクトを使って編集内容をファイルに書き込みます。

フォームの値はAlForm#validateメソッドで取得しています。validateメソッドの内部ではAlForm#fetch_requestが自動的に呼ばれるので、action_update_submitメソッド内ではfetch_requestメソッドの明示的な呼び出しは行っていません。

    if ! @form.validate()
      # バリデーションエラーならフォームへ戻す
      AlTemplate.run( @template_update || "#{AL_BASEDIR}/templates/form.rhtml" )
      return
    end

フォームから取得した値は、AlPersistSh#updateメソッドでファイルに書き出しています。

    @result = @persist.update( { @form.values[:key] => @form.values[:value] } )

action_delete

削除の確認画面を表示します。

action_delete_submit

削除を実行します。

フォームから値を取得し、AlPersistSh#deleteメソッドで削除を行っています。

    @result = @persist.delete( { @form.values[:key] => @form.values[:value] } )
    AlTemplate.run( @template_delete_submit || "#{AL_BASEDIR}/templates/delete_submit.rhtml" )

フォームの表示

AloneにはAlFormオブジェクトとそれに関連づけれらたAlWidgetオブジェクトを参照して自動的にHTMLフォームを表示する機能があります。本サンプルでもこの機能を利用しており、ビューを簡潔に記述しています。

v_form.rhtmlの内容を以下に示します。AlForm#get_messages_by_htmlはフォームのバリデーションでエラーが発生した場合にエラーの一覧をHTMLで返します。AlForm#make_tiny_formはAlFormオブジェクトに関連づけられたAlWidgetオブジェクトを参照して自動的にフォームのHTMLを返します。

header_secion, body_section, footer_sectionなど定型的なHTMLを出力するメソッドを併用することにより、きわめて短い行数でビューを記述することができます。

<%= header_section %>
  <title>htpasswd: 登録/編集</title>
 
<%= body_section %>
  <div class="al-page-header">ユーザ新規登録/変更</div>
 
  <%= @form.get_messages_by_html() %>
  <%= @form.make_tiny_form() %>
 
<%= footer_section %>