TodoList: Todo 詳細の削除2007年01月11日 12時11分11秒

今度は Todo の詳細 (Description) を消せるようにする。

まずは、詳細 (Description) をテーブルを使って、表示する。show.rthml と edit.rhtml を変更する。


% cvs diff app/views/todo/{show,edit}.rhtml
--- app/views/todo/show.rhtml   9 Jan 2007 04:27:15 -0000       1.5
+++ app/views/todo/show.rhtml   9 Jan 2007 04:31:58 -0000
@@ -4,7 +4,9 @@
 </p>
 <% end %>
 
-<%= render :partial => 'add2', :collection => @todo.descriptions %>
+<table>
+  <%= render :partial => 'add2', :collection => @todo.descriptions %&g
t;
+</table>
 
 <%= render :partial => 'published' %>
--- app/views/todo/edit.rhtml   9 Jan 2007 04:27:15 -0000       1.3
+++ app/views/todo/edit.rhtml   10 Jan 2007 05:05:56 -0000
@@ -10,7 +10,9 @@
   <%= submit_tag 'Add' %>
 <%= end_form_tag %>
 
-  <%= render :partial => 'add2', :collection => @todo.descriptions %>
+<table>
+  <%= render :partial => 'add2', :collection => @todo.descriptions %>
+</table>
 
 <%= render :partial => 'published' %>

その後、partial で呼ばれている _add2.rhtml を編集する。


% cvs diff app/views/todo/_add2.rhtml
--- app/views/todo/_add2.rhtml  5 Jan 2007 04:41:41 -0000       1.1
+++ app/views/todo/_add2.rhtml  10 Jan 2007 05:07:53 -0000
@@ -3,14 +3,24 @@
 <tr id="description_<%= add2.id %>" >
 
   <!--[form:description]-->
+  <td>
   <p><label for="description_description">Description (
   <%= Language.find(add2.language_id).name %>
   ):
   </label>
+  </td>
+  <td>
   <%= text_field 'description', 'description',
     :name => "description[" + add2.id.to_s() + "][description]",
     :value => add2.description %>
   <%= hidden_field 'description', 'language_id', :value => add2.language_id %>
+  </td>
+  <td>
+     <%= link_to 'Destroy',
+       { :action => 'destroy_description', :id => add2.id },
+       :confirm => 'Are you sure?', :post => true %>
+  </td>
   </p>

まず、テーブルにするために tr タグを加えて、link_to を追加する。todo_controller.rb の destory_description 関数に飛ぶようにする。最後に大切なのが id だ。こちらは元の Todo の id ではなく詳細 (Description) の id を使う。削除の対象は詳細 (Description) だからだ。

そして、目的の詳細 (Description) を削除する。


% cvs diff app/controllers/todo_controller.rb
--- app/controllers/todo_controller.rb  9 Jan 2007 04:27:15 -0000       1.13
+++ app/controllers/todo_controller.rb  10 Jan 2007 04:58:08 -0000
@@ -70,5 +80,13 @@
     redirect_to :action => 'list'
   end
 
+  def destroy_description
+    desc = Description.find(params[:id])
+    desc.destroy()
+    redirect_to :action => 'edit', :id => desc.todo_id
+  end
+
   def result
     @keyword = @params[:user][:keyword]

destroy を呼ぶと、データベースからは削除されるが、オブジェクトは更新不可能になるが、まだ生きている。そこから、元となった Todo の id を引っ張り出して、show.rhtml に飛ぶ。

前回