TodoList: Todo の多国語対応開始 ― 2007年01月06日 12時39分11秒
既に実行してしまったが、todos テーブルに language_id
と primary_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 レコードを作り、同期化させるのは、手間が掛かりそうだ。不可能では無いが、あまり気が進まない。
デザインの失敗か。やり直すことにする。
最近のコメント