TODOアプリを作ろう!
0:機能はなにがある?
新規追加機能が付いている
それぞれに編集機能と削除機能がついている
空文字を認めない(ストロングパラメーター)
5文字以上じゃないとタイトルを入力してくださいと言う文字列を返す
チェックボックスを押すと更新しなくてもサーバーと通信をして動的処理を行うAjax機能を付ける
cloud9で開発する
1:環境構築
ターミナルで以下をコマンド
ジェムをインストール(rails) gem install rails --version="5.1.4" --no-document バージョンチェック rails -v touch rails_projects cd /home/ec2-user/environment/rails_projects/ プロジェクトの作成するよ! rails new todo cd todo コントローラー作成するよ! rails g controller Tasks
2:モデル名「Task」を作成
大文字で単数であることに注目
rails g model Task title:string done:boolean
後ろはデータベースの構造を指定している
タイトルはカラム名でStringはデータの型を指定している、
doneはタスクの完了の状態を保持するカラム、
真偽値をとるためbooleanを型としている。
db/migrate/2021***********.rbにcreate_tasksが生成される
t.boolean :done, default: false #追加
3:DBスキーマ(DBの構造)をDBに反映させる
rake db:migrate
データベースを見るとき
rails db
sqlite> .schema
CREATE TABLE "schema_migrations" ("version" varchar NOT NULL PRIMARY KEY);
CREATE TABLE "ar_internal_metadata" ("key" varchar NOT NULL PRIMARY KEY, "value" varchar, "created_at" datetime NOT NULL, "updated_at" datetime NOT NULL);
CREATE TABLE "tasks" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "title" varchar, "done" boolean DEFAULT 'f', "created_at" datetime NOT NULL, "updated_at" datetime NOT NULL);
↑で設定がわかる
.exitでsqliteから出る
4:初期データを作成する
rails コンソールを使うモデルの操作やデバッグに便利
rails console Task.create(title: "test1") Task.create(title: "test2") exit モデルなので大文字なことに注意しよう
5:ルーティングを設定しよう!
config/routes.rb
#↓よく使う一般的なルーティングをまとめて生成してくれる resources :tasks root 'tasks#index' #↑rootURLでアクセスしたときtasksコントローラの #インデックスアクションメソッドを実行するということ。
rake routes
Prefix Verb URI Pattern Controller#Action
tasks GET /tasks(.:format) tasks#index
POST /tasks(.:format) tasks#create
new_task GET /tasks/new(.:format) tasks#new
edit_task GET /tasks/:id/edit(.:format) tasks#edit
task GET /tasks/:id(.:format) tasks#show
PATCH /tasks/:id(.:format) tasks#update
PUT /tasks/:id(.:format) tasks#update
DELETE /tasks/:id(.:format) tasks#destroy
root GET / tasks#index
Prefix: プログラムを書く時にパスを指定するのに使う。
URL パターン :それぞれのURLにアクセスした時に 行われるアクション
6:一覧画面のコントローラーを開発
app/controller/tasks_controller.rb
def index @tasks = task.all end
@tasksはテンプレート変数と呼ばれテンプレートファイルに埋め込める値、
つまり、ビューにはインスタンス変数を渡すために使うアクションメソッドにデータを受け渡す。
Task.all タスクステーブルからすべてのレコードを取得する。
7:一覧画面の開発
app/views/tasksフォルダ内にindex.html.erbを作成して
app/views/index.html.erbで以下の記述を追加します。
<h1>TODOアプリ</h1>
<ul>
<% @tasks.each do |task| %>
<li>
#check_box_tagはHTMLのチェックボックスを作るヘルパー
<%= check_box_tag '', '' %>
<%= task.title %>
</li>
<% end %>
</ul>
ルビーが埋め込めるテンプレートで<% %>や<%= %>で囲まれた部分にRubyを使うことができる。
@tasksは複数のデータが入っているので、それぞれeachで1個ずつ取り出しながら空のチェックボックスとデータベースのtasksテーブルのタイトルカラムのタイトルを出力
<%任意のコード%>任意のコードを実行したいときに使うよ
<%=何らかの値を返す式 %>なにか出力したいときに使うよ
rails sにて確認ブラウザで確認して↓のようになればOK!

8:新規追加画面の開発
views/tasks/index.html.erbで
link_toでハイパーリンクを追加するヘルパーで新規追加にリンク機能をつけるよ
<%= link_to ‘新規追加’, new_task_path %>
※まだリンク先を作ってないため押すとエラー
app/views/tasksにリンク先の新規ファイルnew.html.erbを作成するよ
app/views/new.html.erbに以下の記述を追加する
<h1>新規追加画面</h1>
<%= form_for @task do |f| %>
<p>
<%= f.label :title %> <br>
<%= f.text_field :title %>
</p>
<p>
<%= f.submit %>
</p>
<% end %>
fは変数だよ
form_forがモデルに関連したフォームを作るヘルパー
f.label: HTMLのラベルタグ相当
f.text_field: テキストボックス
f.submit: サブミットフォームを作る
新規追加画面が作成されたらOKだよ

9:新規追加機能の開発
tasks_controllerでnewアクションを追加
def new @task = Task.new end
インスタンス変数@taskを定義して
new.html.erbの@taskにラベルとテキストボックスと
submitボタンを生成させるインスタンスを作る。
保存ボタンを押した時にテキストボックスに入力した値を
サーバに送信してデータベースに保存させる。
tasks_controllerに追加tasks_paramsはセキュリティ対策でやっているよ
def create
@task = Task.new(task_params)
end
private
def task_params
params[:task].permit(:title)
end
end
#paramsにはフォームから送られたデータが入っているフォームから
#送られてきたデータのうちtitleカラムのみデータに保存するようにしている
次にtasks_controllerのcreateアクションに記述を追加するよ
def create
@task = Task.new(task_params)
if @task.save
redirect_to root_path
else render 'new'
end
@task.saveでデータベースの書き込を行う
セーブできたらルートURLに飛ばす redirect_to root_path
失敗したら新規登録画面に飛ばす render ‘new’
tasks_controllerがこうなっていればOKだよ↓
class TasksController < ApplicationController
def index
@tasks = Task.all
end
def new
@task = Task.new
end
def create
@task = Task.new(task_params)
if @task.save
redirect_to root_path
else
render 'new'
end
end
private
def task_params
params[:task].permit(:title)
end
end
10:バリデーションの追加
次にバリデーション(予め規定された条件や仕様になっているか検証すること。)を追加
空白や5文字以内でない時にエラーを返すのを付加するよ
app/models/task.rbで以下の記述を追加するよ
class Task < ApplicationRecord
validates :title,
presence: { message: 'タイトルを入力してください!'},
length: {minimum: 5, message: '5文字以上で入力してください!'}
end
ユーザーに対してエラーメッセージを返す
app/views/tasks/new.html.rbに
<h1>新規追加画面</h1>
<%= form_for @task do |f| %>
<p>
<%= f.label :タイトル %> <br>
<%= f.text_field :title %>
<% if @task.errors.any? %>
<%= @task.errors.messages[:title][0] %>
<!--エラーが2つのため[0]-->
<% end %>
</p>
<p><%= f.submit %></p>
<% end %>
このようにして
if @task.errors.any?はタスクスモデルで何かしらエラーが起きていたらtask.rbのメッセージが表示されるようになる。
