PR

TODOアプリを作ってRuby on Rails学習【プログラミング初心者でもできる】

Ruby on RailsでTODOアプリ作成ヘッダーエンジニアコラム
記事内に広告が含まれています。
スポンサーリンク

こんにちは、たいし(プロフィールはこちら)です!

Ruby on Railsの学習を始めたいけど、何から始めればいいのかわからないと悩んでいませんか?そんな方には、簡単なTODOアプリを作ることで、Railsの基礎を学ぶことがおすすめです。

なぜならTODOアプリは機能がシンプルで、プログラミングの基礎となる要素を全て学べるからです。私も以前プログラミング初心者のときは、最初はTODOアプリのような簡単なものを作ってプログラミングの基礎を学びました。

この記事では、初心者でも簡単にTODOアプリを作れるように、Ruby on Railsを使った作り方を丁寧に解説します。この記事を読むと、以下のメリットがあります。

  • プログラミングの基礎を理解できる
  • Ruby on Railsの使い方を学べる
  • 簡単なTODOアプリを作れる

ToDoアプリを作ることで、Ruby on Railsの基礎部分について分かるようになる!

\プログラミング未経験者の学習について紹介!/

プログラミング初心者でも安心!エンジニアへの第一歩を踏み出すための3STEP学習法
プログラミングに興味のある未経験の方は必見!この記事では、プログラミング未経験からエンジニアとなる方法を紹介しています。実は方法を間違わなければ、誰でもエンジニアとなることは可能です。この記事を読むことで、プログラミング学習の準備からエンジニアになるための学習3STEPがわかります。

 

  1. 【STEP1】新規アプリのひな形を作成
  2. 【STEP2】ModelとDBを作成する
    1. モデルを作成する
    2. マイグレーションファイルを編集する
    3. マイグレーションでデータベースへ反映する
    4. カラムの追加・削除のする
  3. 【STEP3】投稿機能を作成する
    1. コントローラと投稿機能のアクションを作成する
    2. ルーティングを設定する
    3. newアクションを追加する
    4. 入力フォームを作成する
      1. form_forでフォームを作成する
  4. 【STEP4】フォームの値を送信して受け取る
    1. createアクションを追加する
      1. データを新規登録するためのインスタンス作成
      2. データをデータベースに保存するためのsaveメソッド実行
      3. トップ画面へリダイレクト
  5. 【STEP5】投稿一覧画面を作成する
    1. indexアクションを追加する
    2. すべての投稿を取り出して表示する
    3. Viewファイルを作成する
  6. 【STEP6】投稿詳細画面を作成する
    1. showアクションを定義する
    2. URL内のidをコントローラで受け取る
    3. 詳細ページを作成する
      1. 1件の情報を表示する
      2. 詳細ページへのリンクを設定する
      3. リダイレクト先を変更する
  7. 【STEP7】投稿編集機能を作成する
    1. 編集対象のデータをViewに渡す
    2. 編集対象のデータを表示する
    3. 編集内容を送信して保存する
    4. 編集ページへのリンクを設定する
  8. 【STEP8】投稿削除機能を作成する
    1. destroyアクションを追加する
    2. link_toのHTTPメソッドを指定する
    3. 削除ボタンを設置する
    4. 削除リストをデータベースから削除する
  9. まとめ
スポンサーリンク

【STEP1】新規アプリのひな形を作成

Ruby on Railsの環境構築については、ここでは割愛します。アプリ作成の前に、まずRuby on Railsが使えるように環境構築をお願いいたします。

Ruby on Railsで新規アプリケーションを作成するには、rails newコマンドを使用します。rails newコマンドを実行すると、Railsアプリケーションのひな形が作成されます。

$ rails new アプリ名

今回は、「todo」という名のアプリケーションを作成します。ターミナルに、以下を入力しましょう。

$ rails new todo

 

スポンサーリンク

【STEP2】ModelとDBを作成する

モデルを作成する

実際にモデルを作成していきます。下記のコマンドで、モデルが作成できます

$ rails g model モデル名

モデル名は、英数字の単数形で入力します。また、先頭は必ず英大文字で記述します。今回は、「Todo」という名前で作成します。

$ rails g model Todo

 

マイグレーションファイルを編集する

自動生成されたマイグレーションファイルに、テーブルの内容を書いていきます。「db/migrate/(作成日時)_create_todos.rb」ファイルを開いてください。

マイグレーションファイルの書式は、以下のとおりです。

def change
  create_table :テーブル名 do |t|
    t.データ型 :カラム名
  end
end

create_tableメソッドを「do」から「end」内に記述することで、カラムを定義できます。「t.データ型名 :カラム名と記述します。

今回は、titleカラムをデータ型はstring型で作成します。赤文字の行を追加してください。

db/migrate/(作成日時)_create_todos.rb
def change
  create_table :lists do |t|
    t.string :title
    t.timestamps
  end
end

 

マイグレーションでデータベースへ反映する

ここまでの記述で、カラムの定義が完成しました。ただし、まだテーブルは作成されていません。マイグレーションファイルからテーブルを作成しなくてはなりません。

マイグレーションファイルからテーブルを作成するコマンドは、以下のとおりです。

$ rails db:migrate

 

カラムの追加・削除のする

新たに別のカラムを追加したい場合や、誤った名前でカラムを追加したい場合もでてきます。その場合は、以下のコマンドを実行することで追加・削除ができます。

【カラムの追加コマンド】

$ rails g migration Addカラム名Toテーブル名 カラム名:型名

【カラムの削除コマンド】

$ rails g migration Removeカラム名Fromテーブル名 カラム名:型名

最後に、rails db:migrateコマンドでテーブルに反映させます。

 

スポンサーリンク

【STEP3】投稿機能を作成する

コントローラと投稿機能のアクションを作成する

まず、アプリケーションの機能を制御するコントローラを作成します。ここでは「todos」という名前にします。以下のように入力します。

$ rails g controller todos

これで、コントローラが作成されます。

 

ルーティングを設定する

ルーティングは、個別に設定も可能です。ただし、今回扱う7つのアクションは開発の際によく使われるので、そのたびに設定するのは効率的とはいえません。こんなときは、ルーティングを1行書くだけで自動設定される機能を使います。

config/routes.rb
Rails.application.routes.draw do
  # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html
  resources :todos
end

 

newアクションを追加する

newアクションでは、投稿フォームが表示されます。「Todoモデル」のインスタンス変数を、todosコントローラに定義しましょう。

app/controllers/todos_controller.rb
class TodosController < ApplicationController
  def new
    @todo = Todo.new
  end
end

コントローラのインスタンス変数をViewと共有することで、コントローラからViewへのデータの受け渡しができます。インスタンス変数の名前には、先頭に必ず@を付けます。今回は、@todoとします。

 

入力フォームを作成する

app/views/todosにnew.html.erbを作成し、そこに記述していきます。今回は、form_forヘルパーを使って作成していきます。

 

form_forでフォームを作成する

form_forの基本形は、以下の通りです。

<%= form_for(@todo) do |f| %>
<% end %>

form_forはインスタンス変数を取得して、ブロック変数「f」に渡しています。

「ブロック変数」 とは、特定の範囲内で有効な変数です。今回は、form_forのdoからendまでが有効範囲です。今回は、テキストボックスと送信ボタンを追加します。

<%で始まるタグは、Rubyで使われるタグです。<% %>では、タグ内の結果が画面に表示されずに処理されます。<%= %>では、タグ内の結果が画面に表示されます。フォーム入力欄は画面に表示するため<%= %>で書きます。

では作成したnew.html.erbに、以下を記述します。

app/views/todos/new.html.erb
<h1>新規投稿</h1>

<%= form_for(@todo) do |f| %>

  <h4>タイトル</h4>
  <%= f.text_field :title %>

  <%= f.submit '投稿' %>

<% end %>

new.html.erbでは、データの入力のみ可能です。todosコントローラにcreateアクションを設定することで、データベースへの保存ができます。

 

スポンサーリンク

【STEP4】フォームの値を送信して受け取る

createアクションを追加する

「投稿する」ボタンを押すことで、todosコントローラのcreateアクションが走ります。createアクションで、データを登録するための処理を以下のように記述します。

app/controllers/todos_controller.rb
class TodosController < ApplicationController

  def new
    @todo = Todo.new
  end

  def create
    todo = Todo.new(todo_params)
    todo.save
    redirect_to todos_path
  end
  private
    def todo_params
    params.require(:todo).permit(:title)
  end

end

ここの記述内容について、詳しくみていきます。

 

データを新規登録するためのインスタンス作成

todoインスタンスでは、Listのnewが呼び出され、引数でtodo_paramsを呼び出します。 todo_paramsはprivateと書かれた行の下に定義されています。

privateはボーダーで、ここから下はcontrollerの中でしか呼び出せません。そのため、他のアクションを巻き込まないようにprivateはファイルの一番下のendのすぐ上に書いて下さい。

ストロングパラメータは、フォームの入力値をコントローラのcreateやupdateに渡す役割があります。さらにハッキングなどで不正に入力値を奪われないために、controllerの中でしか呼び出せないようにする役割もあります。

privateメソッドの名前は、「モデル名_params」とすることが多いです。

 

データをデータベースに保存するためのsaveメソッド実行

DBにデータを保存するにはtodoインスタンスを生成し、saveを呼び出します。

今回はnewアクションのときと違い、@を変数につけていません。@なしのローカル変数は、アクション内でしか利用できません。今回はビューファイルへの受け渡しが必要ではないため、ローカル変数を利用しています。

これで、フォームからデータベースへ保存できるようになりました。

 

トップ画面へリダイレクト

redirect_to todos_pathはデータベースへ保存した後、投稿一覧画面へリダイレクトするようにしています。

 

スポンサーリンク

【STEP5】投稿一覧画面を作成する

投稿一覧ページを作成するため、コントローラにindexアクションを作成します。indexアクションで、全データをデータベースから取得し、投稿一覧ページを表示します。

 

indexアクションを追加する

todosコントローラにindexアクションを追加します。

app/controllers/todos_controller.rb
class TodosController < ApplicationController

...

  def index
  end

  private

...

end

 

すべての投稿を取り出して表示する

データベース内のすべてのデータを取り出すには、Todoモデルに対して.allメソッドを使います。Todo.allメソッドでは、todosテーブルからすべてのデータを取得し、インスタンス変数@todosに代入します。@todosには、一つひとつのデータが配列で入っています。

投稿機能を作成したとき、インスタンス変数は単数形の「@todo」でした。しかし、今回のインスタンス変数名は複数形の「@todos」です。このインスタンス変数には、すべてのデータが取り出されて格納されるため、インスタンス変数名を複数形にしています。

app/controllers/todos_controller.rb
class TodosController < ApplicationController

...

  def index
    @todos = Todo.all
  end

  private

...

end

 

Viewファイルを作成する

app/views/todosフォルダ内に、index.html.erbファイルを作成します。

Viewファイルを作成できたら、@todosから取得した投稿データをすべて表示する処理を記述します。配列がもつ要素を順番に取得して処理を実行したいときは、eachメソッドを使います。@todos.eachと記述することで、Todoレコードの数だけ繰り返し処理を行います。さらに、todo.titleと記述することで、投稿のタイトルが表示されます。なお、eachの箇所では、<% %>に「=が付かない」ことに注意してください。

app/views/todos/index.html.erb
<h1>投稿一覧</h1>
  <% @lists.each do |list| %>
    <p>タイトル</p>
    <span><%= list.title %></span>
  <% end %>

ここまでできれば、rails sでサーバーを起動してください。そしてhttp://localhost:3000/todosにアクセスし、ブラウザで確認しましょう。

 

スポンサーリンク

【STEP6】投稿詳細画面を作成する

showアクションを定義する

todosコントローラにshowアクションを追加します。showアクションは、特定idの内容を表示するアクションです。

app/controllers/todos_controller.rb
class TodosController < ApplicationController

...

  def show
  end

  private
...

end

 

URL内のidをコントローラで受け取る

詳細ページで呼び出される投稿データは、URLの/todo/:id内の:idで判別します。この:idは、アクション内にparams[:id]と記述することで取得できます。

たとえば、URLが/todo/1の場合、params[:id] と記述すると、id=1を取り出せます。id==1のデータをfindメソッドを利用してデータベースから取得し、@todoへ格納します。

レコード1件を取得するので、変数名は単数形の「@todo」にします。

class TodosController < ApplicationController

...

  def show
    @todo = Todo.find(params[:id])
  end

  private

...

end

 

詳細ページを作成する

次に、app/views/todosフォルダに、show.html.erbファイルを作成します。

 

1件の情報を表示する

タイトルと本文は、以下のように記述することで取得できます。showアクションで@todoにデータが1件、格納されています。

app/views/todos/show.html.erb
<h2>タイトル</h2>
<p><%= @todo.title %></p>

では$ rails sで確認してみましょう。サーバーを起動できたら、http://localhost:3000/todos/1へアクセスしてください。

ちなみに投稿ができていない状態で、id=1を開いてもエラー画面が出力されますので注意してください。

 

詳細ページへのリンクを設定する

次に、投稿一覧ページから詳細ページへ遷移するリンクを設定します。リンクを設定するには、link_toメソッドを利用します。link_toメソッドは、HTMLの要素を出力するメソッドです。以下のように記述します。

<%= link_to 表示させるテキスト , “リンク先”  %>

app/views/todo/index.html.erb
<h1>投稿一覧</h1>
  <% @todos.each do |todo| %>
  <p>タイトル</p>
  <span>
    <%=link_to list.title, todo_path(todo.id) %>
  </span>
<% end %>

投稿一覧へアクセスして、確認してみましょう。<a>タグに変わっていて、クリックすると詳細画面に飛びます。

 

リダイレクト先を変更する

新規投稿後の動きを、show.html.erbへリダイレクトさせて、投稿内容がすぐに閲覧できるようにします。
link_toの送信先URLと同様に、「転送したいアクションへのURL」を指定します。showアクションにリダイレクトさせるには、名前付きルートを使用して、redirect_to todo_path(todo.id)と記述します。

app/controllers/todos_controller.rb
class TodosController < ApplicationController

...

def create
  todo = Todo.new(todo_params)
  redirect_to todo_path(todo.id) 
end

private

...

end

できたらサーバーを起動し、新規投稿してみましょう。投稿後に、詳細画面が表示されるはずです。

 

スポンサーリンク

【STEP7】投稿編集機能を作成する

編集対象のデータをViewに渡す

次に、コントローラのルーティングを設定します。findメソッドを用いて、データを取得しましょう。

コントローラにeditアクションを追加します。

app/controllers/todos_controller.rb
class TodosController < ApplicationController

...

  def edit
    @todo = Todo.find(params[:id])
  end

  private
... 

end

 

編集対象のデータを表示する

app/views/todosフォルダにedit.html.erbファイルを作成し、このファイル上に編集対象のデータを表示します。

以下のように記述します。

app/views/todos/edit.html.erb
<h1>編集画面</h1>
<%= form_for(@todo) do |f| %>
  <h4>タイトル</h4>
  <%= f.text_field :title %>
  <%= f.submit '保存' %>
<% end %>

 

編集内容を送信して保存する

編集内容を送信し、データベースに保存して反映させましょう。

投稿を更新するためのupdateアクションを作成します。
以下のように追加します。

app/controllers/todos_controller.rb
class TodosController < ApplicationController

...

  def update
    todo = Todo.find(params[:id])
    todo.update(todo_params)
    redirect_to todo_path(todo.id)
  end

  private
... 

end

updateアクションでは、データの更新後に更新結果を詳細ページに表示するために、showアクションにリダイレクトさせます。

showアクションにリダイレクトするために、引数には必ずidが必要になります。idを付けることで、どのデータを詳細ページで表示させるのかを決定しています。

 

編集ページへのリンクを設定する

詳細ページ(show.html.erbファイル)に、編集画面へ遷移するリンクを設定します。

app/views/todos/show.html.erb
<h2>タイトル</h2>
<p><%=@todo.title %></p>

<%= link_to "編集", edit_todo_path(@todo.id) %>

それではサーバーを起動し、アクセスして編集できるかを確認しましょう。

 

スポンサーリンク

【STEP8】投稿削除機能を作成する

destroyアクションを追加する

まず、destroyアクションを追加します。

app/controllers/todos_controller.rb
class TodosController < ApplicationController

...

  def destroy
  end

  private
...

end

 

link_toのHTTPメソッドを指定する

投稿データを削除するには、画面上の「削除」ボタンをクリックします。「削除」ボタンをクリックしたときにアクションが実行されるリンク先を、link_toメソッドで設定します。以下のように記述します。

<%=link_to '表示するテキスト', URL, method: :delete %>

link_toのリンク先HTTPメソッドは、GET、POST、PATCH、DELETEを指定できます。link_toでHTTPメソッドを指定しない場合は、デフォルト値としてGETメソッドで設定されます。

destroyアクションのHTTPメソッドはDELETEです。このため、link_toの引数でmethod: :deleteを指定します。

 

削除ボタンを設置する

destroyアクションへのリンクを、show.html.erbファイルに作成します。HTTPメソッドは、DELETEを指定します。誤って「削除」をクリックしてしまった場合に備えて、data-confirmを用いて削除確認ダイアログも表示されるようにしています。

app/views/todos/show.html.erb
<h2>タイトル</h2>
<p><%=@todo.title %></p>

<%= link_to "編集", edit_todo_path(@todo.id) %>
<%= link_to "削除", destroy_todo_path(@todo.id), method: :delete, "data-confirm" => "本当に削除しますか?" %>

 

削除リストをデータベースから削除する

「削除」ボタンをクリックすると、送られてきた削除idを元にレコードが探され、そのレコードを削除します。さらに、destroyメソッドによって、テーブルからデータが削除されます。データ削除後のリダイレクト先は、投稿一覧ページtodos_path(indexアクション)にします。

app/controllers/todos_controller.rb
class TodosController < ApplicationController

...

  def destroy
    todo = Todo.find(params[:id])
    todo.destroy
    redirect_to todos_path
  end

  private
...

end

todo = Todo.find(params[:id])でレコード1件が取得され、todo.destroyでレコードが削除されます。redirect_to todos_pathでリストの一覧画面へリダイレクトされます。

保存ができたら、ブラウザを表示して投稿が削除できるかどうかを確認しましょう。

 

スポンサーリンク

まとめ

今回はRuby on Railsを使った、TODOアプリの作成について紹介しました。Ruby on Railsでのアプリ開発の根っこの部分は今回紹介した内容で、あとはほしい機能に対して肉付けをしていくようなイメージとなります。

プログラミング初心者の方は、まずこの記事を参考に初歩的なアプリ開発の学習をしていただくのがいいです。その後でもっと画面をおしゃれにカスタマイズしてみたり、新しい機能をコントローラーに書いて実装してみたりと試していただけたらなと思います。そうすることで知識が深まり、技術力が上がることでエンジニアの道も見えてきます!

 

\プログラミング未経験者の学習について紹介!/

プログラミング初心者でも安心!エンジニアへの第一歩を踏み出すための3STEP学習法
プログラミングに興味のある未経験の方は必見!この記事では、プログラミング未経験からエンジニアとなる方法を紹介しています。実は方法を間違わなければ、誰でもエンジニアとなることは可能です。この記事を読むことで、プログラミング学習の準備からエンジニアになるための学習3STEPがわかります。
スポンサーリンク
エンジニアコラム
Taishiをフォローする
スポンサーリンク
I’LL BE:未経験からのエンジニア転職