ドットインストールを見ながらタスク管理アプリの作成を試してみました。Modelの作成やルーティング、コントローラの処理の作成などRailsアプリ開発の基本的な部分を勉強できました。
まずはrails newコマンドを実行
$ rails new task_app $ $ cd task_app
モデルの作成
$ rails g model Project title:string
※モデルは単数形、最初は大文字
※デフォルトがStringなので『:string』は省略可能
マイグレーションファイルを作成したら次のコマンドでDBに反映させる。
$ rake db:migrate
Schemeの確認
DBが正しく作成できているかを確認。次のコマンドでSQLiteが起動できる。
$ rails db
次のコマンドでSchemeの確認ができます。
sqlite> .schema
このモードを終了するときは次のコマンドでOK。
.exit
Railsコンソールでデータの作成
データはRailsコンソールから作成できます。
$ rails c > p = Project.new(title: "p1") > p.save
newではなくcreateを使うとsaveも自動で実行されます。
$ rails c > p = Project.create(title: "p2")
Project.allコマンドでデータの一覧を表示できます。
$ rails c > Project.all
railsコンソールモードは次のコマンドで終了できます。
> quit
データを作成したので『rails:db』でクエリを実行すると内容を確認できます。
コントローラの作成
次のコマンドでコントローラを作成できます。
$ rails g controller Projects
※コントローラは複数形
routesファイルの変数
config > routes.rbを編集します。(Projectに関するURLを自動生成してくれる)
TaskApp::Application.routes.draw do resources :projects end
ルーティングの設定ができたら、次のコマンドで確認する。
$ rake routes
ブラウザからアクセスできるURLの一覧を表示できます。
Projectsの一覧を表示してみる
1. コントローラを編集
app > controllers > projects_controller.rb
※@projectsという変数にProjectのデータをセットしている
2. ビューを用意する
app > views > projects > index.html.erbを新規作成
※コントローラのindex用なので同じ名前になるように命名
これでProjectsの一覧を表示できました。
rootの設定
rootを設定すると「/projects」を省略できます。
共通テンプレートの編集
app > views > layout > application.html.erbが共通テンプレートです。
このように一括変更できます。
スタイルの変更は「app > assets > stylesheets > application.css」から変更。
背景色を変えたりします。
詳細ページを作成する
まずはindex.htmlのプロジェクト名を表示しているところにリンクを追加します。
コントローラにshowを追加します。
この『Project.find(params[:id])』という書き方でURLパラメータのIDを条件に検索ができます。
ビューにshow.html.erbを追加します。
これで詳細ページが作成できました。
新規ページを作成する
index.html.erbに新規ページへのリンクを追加します。
コントローラにnewを追加します。
new.html.erbを新規作成します。
こんな感じでページを表示できます。
保存処理を追加する
コントローラにcreateを追加します。
これでcreate projectボタンをクリック時に保存処理を実行できます。
ModelにValidationを設定する
app > models > project.rbに設定します。
保存成功時にページ遷移して失敗時は作成画面を再表示するようにコントローラを編集します。
エラーメッセージを表示する
ModelにValidation処理を追加したので次はエラーメッセージを表示させます。new.html.erbに判定処理を追加します。
<% if @project.errors.any? %> <%= @project.errors.messages[:title][0] %> <% end %>
IF判定でエラー発生時にのみ表示するように指定します。
これでエラーメッセージを表示できます。
エラーメッセージを任意の文字にしたい場合はModelで次のように記載します。
文字数チェックもできます。
編集フォームの作成
index.html.erbにEditリンクを追加
projects_controller.rbにeditを追加
edit.html.erbを作成
これで編集ページを表示できます。
保存処理を追加
projects_controller.rbにupdate処理を追加
これで保存処理が実行できるようになります。
パーシャルを使って共通化
new.html.erbとedit.html.erbは共通部分があるのでパーシャルで共通化します。
views > projects > _form.html.erb
new.html.erb
edit.html.erb
これでフォームの共通化ができました。
データ削除の追加
index.html.erbにDeleteリンクを追加します。
method: :deleteという処理を追加することでDeleteアクションを実行できます。これで確認メッセージを表示するところまでできました。
コントローラにdestroyの処理を追加すれば削除処理が実行できるようになります。
before_actionをつかって重複処理の共通化
コントローラの処理で複数回出てきた『@project = Project.find(params[:id])』を共通で呼び出せるようにします。
before_action :set_project, only: [:show, :edit, :update, :destroy]
privateの処理に次のメソッドを用意して準備完了です。
def set_project @project = Project.find(params[:id]) end
補足
最後に処理を実行できるafter_actionもあります。
プロジェクトに紐付くタスクの追加
次のコマンドでタスクのModelを作成します。(:referencesで参照関係)
$ rails g model Task title done:boolean project:references
マイグレーションファイルはエディタでも編集できます。default: falseというように指定することで初期値を指定できます。
db > maigrate > ....
マイグレーションファイルの準備ができたら次のコマンドでDBに反映させます。
$ rake db:migrate
タスクのコントローラを作成
次のコマンドを実行します。
$ rails g controller Tasks
AssociationでModelの関連付け
TaskのModelファイルを見るとこのようになっています。
belongs_to :projectというのでprojectと紐付いていることがわかります。
projectのModelファイルには『has_many :tasks』を追加します。これでタスクと1対多で紐付いていることを宣言できます。
ルーティングの設定
routes.rbに次のように処理を追加します。
resources :projects do resources :tasks, only: [:create, :destroy] end
これで準備ができました。
タスク一覧と登録フォームの作成
まずプロジェクトの詳細ページにタスク一覧の表示と新規登録フォームを追加します。次のように書くことでプロジェクトに紐付くタスクという指定でループができます。
<% @project.tasks.each do | task| %>
タスク登録処理の作成
タスクのコントローラに次のように処理を追加します。
これで登録処理が実行できるようになります。
ちなみに必須チェックはタスクのModelで次のように指定します。
タスクの削除
show.html.erbにDeleteリンクを追加します。
タスクのコントローラにdestroyの処理を追加します。
タスク完了チェックの追加
チェックボックスは次のように表示できます。
<%= check_box_tag '', '', task.done, {'data-id' => task.id, 'data-project_id' => task.project_id} %> |
これでチェックボックスが表示されました。
Ajaxを使った処理
show.html.erbにscriptを次のように追加します。
<script> $(function() { $("input[type=checkbox]").click(function() { $.post('/projects/' + $(this).data('project_id') + '/tasks/' + $(this).data('id') + '/toggle'); }); }); </script
toggleアクションを使うためにルーティングの設定を行います。
post '/projects/:project_id/tasks/:id/toggle' => 'tasks#toggle'
タスクコントローラにtoggoleアクションの処理を用意します。
これでチェック時にJSエラーが出ていないかを確認すると『POST http://localhost:3000/projects/3/tasks/5/toggle 500 (Internal Server Error)』というエラーが発生しています。
このエラーは『def toggle』に『render nothing: true』を追加することで解決します。
def toggle render nothing: true @task = Task.find(params[:id]) @task.done = !@task.done @task.save end
これでチェックボックス切替時にタスクのdone項目の値が更新できるようになりました。
タスクの件数を表示する
プロジェクトに紐付くタスクの件数を表示したい場合は次のとおりです。
<%= project.tasks.count %>
これで件数を表示できます。
残タスクの表示
残タスクのように特定の条件でフィルタリングした件数を取得したい場合、Modelで条件指定を行います。
scope :unfinished, -> { where(done: false) }
modelで宣言したunfinishedはviewでも利用できるので次のように書けます。
<%= project.tasks.unfinished.count %>
これで残タスクも表示できます。
以上がRailsアプリ開発の基本的な進め方となります。