Todoリストの作成

p.11〜16まで。この回からscaffoldでmodelを作って、DBにデータを貯めるアプリを作ることになる


ここまでの作業内容。
http://bitbucket.org/shokai/web-innovative/changeset/ecbe2a4194f3/

rails _2.0.2_ todo
cd todo


config/database.yml を一応確認。DBとしてsqlite3が選択されていればよし。

# SQLite version 3.x
#   gem install sqlite3-ruby (not necessary on OS X Leopard)
development:
  adapter: sqlite3
  database: db/development.sqlite3
  timeout: 5000

# Warning: The database defined as 'test' will be erased and
# re-generated from your development database when you run 'rake'.
# Do not set this db to the same as development or production.
test:
  adapter: sqlite3
  database: db/test.sqlite3
  timeout: 5000

production:
  adapter: sqlite3
  database: db/production.sqlite3
  timeout: 5000

scaffoldでMVCまとめてgenerateする。todoは単数形にするのに注意

ruby script/generate scaffold todo task:string done:boolean


db/migrate/001_create_todos.rb にmigrateコードが生成されているのを確認

class CreateTodos < ActiveRecord::Migration
  def self.up
    create_table :todos do |t|
      t.string :task
      t.boolean :done

      t.timestamps
    end
  end

  def self.down
    drop_table :todos
  end
end


migrade。これでDBが初期化される

rake db:migrate
ruby script/server

http://localhost:3000/todos で作ったtodoが見える。複数形に注意。


app/views/todos/index.html.erb にdoneというアクションへのリンクを追加。

<h1>Listing todos</h1>

<table>
  <tr>
    <th>Task</th>
    <th>Done</th>
  </tr>

<% for todo in @todos %>
  <tr>
    <td><%=h todo.task %></td>
    <td><%=h todo.done %></td>
    <td><%= link_to 'Done', :action => 'done', :id => todo %></td><!-- doneアクションへのリンク -->
    <td><%= link_to 'Show', todo %></td>
    <td><%= link_to 'Edit', edit_todo_path(todo) %></td>
    <td><%= link_to 'Destroy', todo, :confirm => 'Are you sure?', :method => :delete %></td>
  </tr>
<% end %>
</table>

<br />

<%= link_to 'New todo', new_todo_path %>


app/controllers/todos_controller.rb にdoneメソッド追加。これがviewから呼ばれる。

class TodosController < ApplicationController
  
  def done
    @todo = Todo.find(params[:id])
    @todo.done = true;
    @todo.save
    redirect_to :action => 'index'
  end

ブラウザで http://localhost:3000/todos を見てみる。
doneを押すとfalseがtrueになり、タスク完了のしるしになる。
8cdf746a16dc637a5331acf69917ecab.png