TodoList: Todo の多国語対応開始2007年01月06日 12時39分11秒

次は Todo の変更だ。

既に実行してしまったが、todos テーブルに language_idprimary_id を追加した。


ALTER TABLE todos ADD language_id INT;
ALTER TABLE todos ADD primary_id INT;

language_id は各々の Todo がどの言語で書かれているかを示すのに使う。primary_id は最初に Todo の原本が作られた時は id と同じにして、他の言語を追加するときには、元となった言語の Todo の id を保持して、同一な Todo を区別するのに使う。

以下のような言語サポートを考えている。 list アクションでは、単純に全てを表示する。後々表示に問題が出たら、その時に対策をとる。 new アクションは新規の Todo のみ作る。 show または edit アクションは、primary_id が同じ Todo を全て表示する。また、id == primary_id だった場合には、同一画面内に add.rhtml で作られる新規入力画面を準備する。これは、存在する Todo を他の言語で入力する時に使う。恐らく create 関数が両方の場面で使えると思う。違いは primary_id の設定の仕方だ。恐らく params[:action] をうまく利用すれば区別できそうだ。 destory は、今のところは単純にしようと思う。つまり、何も変更を加えない。

とりあえず、ビューを変更する。以前に所属組織 (Organization) に同じような変更を加えたので、簡単だ。


% cvs diff app/views
--- app/views/todo/_form.rhtml  4 Jan 2007 03:10:47 -0000       1.1
+++ app/views/todo/_form.rhtml  4 Jan 2007 03:10:14 -0000
@@ -8,3 +8,10 @@
 <%= text_field 'todo', 'done'  %></p>
 <!--[eoform:todo]-->
 
+<p><label>Language</label><br/>
+    <%= select :todo, :language_id,
+     Language.find(:all).map {|l| [ l.name, l.id ]},
+     {},
+     {}
+     %>
+</p>
--- app/views/todo/list.rhtml   4 Jan 2007 03:09:11 -0000       1.1
+++ app/views/todo/list.rhtml   3 Jan 2007 19:01:46 -0000
@@ -5,6 +5,7 @@
   <% for column in Todo.content_columns %>
     <th><%= column.human_name %></th>
   <% end %>
+  <th>Language</th>
   </tr>
   
 <% for todo in @todos %>
@@ -12,6 +13,10 @@
   <% for column in Todo.content_columns %>
     <td><%=h todo.send(column.name) %></td>
   <% end %>
+  <td>
+    <%= Language.find(:first, todo.language_id).name if todo.language_id %>
+  </td>
+
     <td><%= link_to 'Show', :action => 'show', :id => todo %></td>
     <td><%= link_to 'Edit', :action => 'edit', :id => todo %></td>
     <td><%= link_to 'Destroy', { :action => 'destroy', :id => todo },
       :confirm => 'Are you sure?', :post => true %></td>
diff -u -r1.4 show.rhtml
--- app/views/todo/show.rhtml   20 Dec 2006 03:55:08 -0000      1.4
+++ app/views/todo/show.rhtml   3 Jan 2007 18:55:39 -0000
@@ -3,6 +3,10 @@
   <b><%= column.human_name %>:</b> <%=h @todo.send(column.
name) %>
 </p>
 <% end %>
+<p>
+  <b>Language:</b>
+    <%= Language.find(:first, @todo.language_id).name if @todo.language_id%>
+</p>
 
 <%= render :partial => 'published' %>

変更はしたが、思い直してみると所属組織 (Organization) や作成者 (Creator) 等の情報がある。これらを言語毎に違う Todo レコードを作り、同期化させるのは、手間が掛かりそうだ。不可能では無いが、あまり気が進まない。

デザインの失敗か。やり直すことにする。

前回次回

コメント

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※なお、送られたコメントはブログの管理者が確認するまで公開されません。

名前:
メールアドレス:
URL:
コメント:

トラックバック

このエントリのトラックバックURL: http://uyota.asablo.jp/blog/2007/01/06/1096275/tb

※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。