こんにちは、たいし(プロフィールはこちら)です!
Ruby on Railsの学習を始めたいけど、何から始めればいいのかわからないと悩んでいませんか?そんな方には、簡単なTODOアプリを作ることで、Railsの基礎を学ぶことがおすすめです。
なぜならTODOアプリは機能がシンプルで、プログラミングの基礎となる要素を全て学べるからです。私も以前プログラミング初心者のときは、最初はTODOアプリのような簡単なものを作ってプログラミングの基礎を学びました。
この記事では、初心者でも簡単にTODOアプリを作れるように、Ruby on Railsを使った作り方を丁寧に解説します。この記事を読むと、以下のメリットがあります。
- プログラミングの基礎を理解できる
- Ruby on Railsの使い方を学べる
- 簡単なTODOアプリを作れる
ToDoアプリを作ることで、Ruby on Railsの基礎部分について分かるようになる!
\プログラミング未経験者の学習について紹介!/
【STEP1】新規アプリのひな形を作成
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でのアプリ開発の根っこの部分は今回紹介した内容で、あとはほしい機能に対して肉付けをしていくようなイメージとなります。
プログラミング初心者の方は、まずこの記事を参考に初歩的なアプリ開発の学習をしていただくのがいいです。その後でもっと画面をおしゃれにカスタマイズしてみたり、新しい機能をコントローラーに書いて実装してみたりと試していただけたらなと思います。そうすることで知識が深まり、技術力が上がることでエンジニアの道も見えてきます!
\プログラミング未経験者の学習について紹介!/