todo を眺める

rails なアプリの追い掛け方の例として ...
途中で作業が停止しているカーネルなナニも終わらぬクセにこんなコトしてて良いのかなぁ。

app/controllers 配下をチェック

$ ls app/controllers/
ajax_controller.rb  application.rb  task_controller.rb
$ grep def app/controllers/*.rb
app/controllers/ajax_controller.rb:  def add_list
app/controllers/ajax_controller.rb:  def render_add(ar,name,partial_tempate_name = name)
app/controllers/ajax_controller.rb:  def charset_plain
app/controllers/ajax_controller.rb:  def destroy_list
app/controllers/ajax_controller.rb:  def add_item
app/controllers/ajax_controller.rb:  def render_destroy(ar)
app/controllers/ajax_controller.rb:  def completion_item
app/controllers/ajax_controller.rb:  def edit_item
app/controllers/ajax_controller.rb:  def update_positions
app/controllers/task_controller.rb:  layout 'default'
app/controllers/task_controller.rb:  def index
app/controllers/task_controller.rb:  def charset
$

index アクションがある、task_controller.rb をまず確認。スデにどこかのエントリでコードを引用していると思うのでここでは略。要点を以下に。

  • before_filter を使用して HTTP ヘッダの Content-Type に 'text/html; charset=utf-8' を設定
  • layout は app/views/layouts/default.rhtml を指定
  • index アクションでは @lists に list テーブル全件検索な結果のオブジェクト達を代入

で、default.rhtml の展開に制御が移って、@content_for_layout んトコで app/views/task/index.rhtml を展開して、index.rhtml ん中の

<%= render :partial => 'list', :collection => @lists %>

がさらに展開される、と。対象のナニは :partial で指定されている app/views/task/_list.rhtml が使用されて @lists のそれぞれの要素が使用されていく。

げ。多段構成になってるから微妙にシンドいな。順番としては model からチェックする方が自然な気がしてきたので一旦ストップして model を見ることに。

model のチェキ

  • item.rb
    • items テーブルは lists テーブルに従属
    • acts_as_list により、lists テーブルにぶら下がるリストとして動作
    • note 列は必須入力
  • list.rb
    • 0 個以上の items テーブルの親となる。lists テーブルの親となる行が削除されると従属する items テーブルの該当行は削除される
    • items テーブルのリスト行は position 列の順で取り出される。position 列はシステムが面倒を見る
    • title 列は必須入力

上記がそれぞれの仕様とすれば、単体試験の項目は以下のようなカンジ??

  • item.rb
    • CRUD が正常に動作すること
      • item.toggle! :completion
      • Item.new(:list_id => 1, :note => 'memo')
      • new した後に save
      • item.note = 'memo2'
      • 代入した後に save
      • item.destroy
      • 検索の動作が正常であること (id、全件)
    • note の validation 正常か (不要??)
  • list.rb
    • CRUD が正常に動作すること
      • List.new(:title => 'title')
      • List.new(:title => '')
      • new した後に save
      • list.destroy
      • list.title = 'title2'
      • 代入した後に save
      • 検索の動作が正常であること (id、全件)
    • title の validation 正常か
    • 削除により該当レコードにぶら下がったリストが削除されること
    • list.items から順に取り出したリストが position 昇順であること

別途試してみます。

view に戻る。

app/views/layout/default.rhtml から順に再度チェック。
とりあえず、ざっくりベースで確認してみると、多段な状態として

  • default.rhtml は task コントローラの layout になっている。
  • task の index アクションから起動された場合 (てか、これしかない)、app/views/task/index.rhtml が展開され、default.rhtml 中の @content_for_layout と置換。
  • index.rhtml 中に render :partial があり、index アクションから頂いた @lists を app/views/task/_list.rhtml に渡した結果と置換。
  • _list.rhtml 中にも render :partial があり、list.items を app/views/task/_item.rhtml に渡した結果と置換。

という 4 段ロケットになっていたり。しかしこれ、一覧なんかもスゲぇ楽ちんに表示できるコトがわかる。生産性が良いなんてもんじゃないね。

オイカケる前に完成した状態での仕様を以下に列挙。

  • lists テーブルの全ての行が順に表示
  • list に属する item も全て表示。position 順に並ぶ
  • list の追加が可能
  • list の削除が可能。この時、従属する item も同時に削除される
  • item の追加が可能
  • item は更新可能
  • item の削除は note を空白にして更新する事により可能
  • item は並びかえ可能
  • item のチェックボックスにより完了を表現

以上??
# っても仕様の理解ってアプリをオイカケる時に把握できてりゃ良いんですが ...

form 部分の詳細な記述と対応するアクションについては簡易なものを除いて別途でチェック。とりあえず view での記述中心で。

  • まず最初の要件は index アクションで全件 find したモノを view に渡してるので OK。
  • 次の_list に属する item も全て表示。position 順に並ぶ_については、app/views/task/_list.rhtml の render な部分で list.items を app/views/task/_item.rhtml に渡している事で OK である事が分かる。
  • list の追加処理については app/views/task/index.rhtml に記述されている form_remote_tag な部分になる。ajax コントローラの add_list アクションで追加処理をしているのが分かる。
  • list の削除処理は app/views/task/_list.rhtml の link_to_remote 部分で実装。対応するアクションは ajax コントローラの destroy_list アクションとなっている。従属する item の削除については、list モデルにて実装済み。
  • item の追加についても app/views/task/_list.rhtml に記述あり。対応するアクションは ajax コントローラの add_item アクションとなっている。
  • item の更新は app/views/task/_item.rhtml における Ajax.InPlaceEditor なナニがそれに対応しており、これは削除処理も同時に実装している。対応するアクションは ajax コントローラの edit_item アクションとなっている。
  • item の並び替えは app/views/task/_list.rhtml にて実装。form_remote_tag の部分と sortable_element な部分がそれにあたる。対応するアクションは ajax コントローラの update_positions アクションとなっている。
  • item の完了については、app/views/task/_item.rhtml にて実装。対応するアクションは ajax コントローラの completion_item アクションとなっている。

ざっくり view を眺めて微妙なのが :class というナニなんですが、これって CSS と関係あるだけ、と見て良いのかなぁ。サンプルに付いてる style.css 見てチェックしたいんですが、スタイルシート苦手。

で、以降で更新処理の詳細を掘り下げてみたい、と。