TodoList: desciptions テーブルを準備2007年01月07日 12時28分57秒

Todo レコードを各言語毎に準備するのではなく、description のみを言語毎に準備する事にする。descriptions テーブルを作り todos テーブルと関連づける。今までの、Todo の description は title に変更する。「todos has many descriptions in multi-languages and description belongs to a todo.」だろう。一対多だ。

そうなると、todo/show にて全言語の description を表示し、todo/edit で任意の言語の description を編集できる様にすればいい。todo/list や todo/new を変更する必要も無くなる。また、todos テーブルに付いている付加情報を多言語間で、同期する必要も無くなる。

さっき追加した、language_id を todos テーブルから削除し、description を title に変更する。


% cat multilingual2.mysql
USE todos;
DROP TABLE IF EXISTS `descriptions`;
CREATE TABLE `descriptions`
(
  `id` INT NOT NULL AUTO_INCREMENT,
  `todo_id` INT NOT NULL,
  `description` VARCHAR(100) NOT NULL,
  `language_id` INT NOT NULL,
  PRIMARY KEY(`id`)
);
ALTER TABLE todos DROP language_id;
ALTER TABLE todos CHANGE description title VARCHAR(100) NOT NULL;
% cat multilingual2.mysql | mysql

変更後、http://localhost:3000/todo/list にアクセスしても問題は無かったが、http://localhost:3000/todo/edit/1 に移ったら、

NoMethodError in Todo#edit

Showing app/views/todo/_form.rhtml where line #5 raised:

undefined method `description' for #<Todo:0x9f19c2c>

Extracted source (around line #5):

2: 
3: <!--[form:todo]-->

4: <p><label for="todo_description">Description</label><br/>
5: <%= text_field 'todo', 'description'  %></p>
6: 
7: <p><label for="todo_done">Done</label><br/>

8: <%= text_field 'todo', 'done'  %></p>

と出てしまった。ruby script/generate scaffol をやった後にテーブルを変更すると、案の定問題が出るらしい。

修正する。


% cvs diff app/views/todo/_form.rhtml
diff -u -r1.1 _form.rhtml
--- app/views/todo/_form.rhtml  4 Jan 2007 03:10:47 -0000       1.1
+++ app/views/todo/_form.rhtml  4 Jan 2007 05:29:11 -0000
@@ -1,8 +1,8 @@
 <%= error_messages_for 'todo' %>
 
 <!--[form:todo]-->
-<p><label for="todo_description">Description</label><br/>
-<%= text_field 'todo', 'description'  %></p>
+<p><label for="todo_title">Title</label><br/>
+<%= text_field 'todo', 'title'  %></p>
 
 <p><label for="todo_done">Done</label><br/>
 <%= text_field 'todo', 'done'  %></p>

正しく表示される様になった。

前回次回。