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 レコードを作り、同期化させるのは、手間が掛かりそうだ。不可能では無いが、あまり気が進まない。

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

前回次回