11:編集機能を追加する
app/views/tasks/new.html.erbで以下の記述を追加する
<h1>TODOアプリ</h1> <ul> <% @tasks.each do |task| %> <li> <%= check_box_tag '', '' %> <%= task.title %> <%= link_to '[編集]', edit_task_path(task.id)%> </li> <% end %> </ul>
edit_task_pathなのは↓のPrefixでtasks#editと関連しているため
(task.id)は/tasks/:idに埋め込まれる
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
12:編集画面の開発
app/views/tasks/new.html.erbを複製してedit.html.erbを作成し
app/views/tasks/edit.html.erbで以下の記述を追加
<h1>編集画面</h1> <%= form_for @task do |f| %> <p> <%= f.label :title %> <br> <%= f.text_field :title %> </p> <p><%= f.submit %></p> <% end %>
13:編集機能の開発
tasks_controllerに以下の記述を追加
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 def edit #tasksテーブルから指定されたIDのレコードを取得するという意味 @task = Task.find(params[:id]) end private def task_params params[:task].permit(:title) end end
14:削除機能のViewを開発
<h1>TODOアプリ</h1> <ul> <% @tasks.each do |task| %> <li> <%= check_box_tag '', '' %> <%= task.title %> <%= link_to '[編集]', edit_task_path(task.id)%> <%= link_to '[削除]',task_path(task.id),method: :delete,data:{ confirm: '削除してもよろしいですか?'} %> </li> <% end %> </ul>
メソッドは:deleteを使う
task_path(task.id)なのは↓のdestroyから
DELETE /tasks/:id(.:format) tasks#destroy
15:削除機能の開発
tasks_controllerにて以下を追加
def destroy @task = Task.find(params[:id]) @task.destroy redirect_to root_path end
↑Taskテーブルから指定したIDのデータを取得してインスタンス変数に代入する。該当するデータを削除する。
削除に成功したらルートURLに遷移する
削除ボタンを確認したらOKです
16:トグル動作の開発
Ajaxとは?
ウェブブラウザ内で非同期通信を行いながらインターフェイスの
構築を行うプログラミング手法。
つまり画面を移動(更新含む)しなくても、サーバとの通信を行いながら、
動的に画面の表示内容が変わるWebアプリが作れる技術で
GmailやGoogle mapなどが代表例
JavaScriptのライブラリ、jQueryを使用する。
jQueryのインストール
Gemfileに以下の記述を追加
gem 'jquery-rails', '~>4.3.1' bundle install
app/javascript/application.jsに以下の記述を
//= require jquery3 //= require jquery_ujs
ルーティングの設定
config/locales/routes.rb
Rails.application.routes.draw do resources :tasks root 'tasks#index' post '/tasks/:id/toggle' => 'tasks#toggle' end
postで/tasks/:idこのURLのパターンであったら
tasksコントローラーのトグルアクションメソッドを実行するという意味。
rake routesで確認↓があればOK
POST /tasks/:id/toggle(.:format) tasks#toggle
デストロイメソッドの↓に
def toggle head :no_content @task = Task.find(params[:id]) @task.done = !@task.done @task.save end
↑Ajaxのデータの通信を行いたいのでViewの通信はしないという設定
1:TasksテーブルからブラウザからAjax通信で渡されたIDを使ってレコードを検索する
2:その結果を@taskに入れる
3:該当データのカラムDoneのデータを真偽反転する。
4:TrueがFalseにFalseがTrueになる。
結論からいうと、後の@task.saveでデータをデータベースに保存するためで
task.doneはそのタスクが「終了しているか」、「終了していないか」を管理する変数なので、
真偽値を反転させるのは以下のような操作になる↓
A 終了していない(チェックボックスにチェックが入っていない)状態
↓↑
B 終了している(チェックボックスにチェックが入っている)状態
AとBの状態を切り替えるわけなんだけれども、
この切り替え処理(+(保存処理)をサーバー側(Rails)で行わないと、
HTML上でだけチェックがついたり外れたりするだけで、
切り替えた情報がデータベースに保存されない。
試しに、@task.done = !@task.doneの行(もしくはsaveの行)を
コメントアウトして、チェックをつけたり外したりして、
画面をリロードしてみると、
チェックの情報が保存されていないので、
チェックの情報が以前のものに戻ってしまう。
チェックボックスのトグル動作のクライアント側を開発しよう!
17:トグルメソッドにデータをポストする処理を記述
<h1>TODOアプリ</h1> <ul> <% @tasks.each do |task| %> <li> <%= check_box_tag '', '', task.done, {'data-id' => task.id } %> <%= task.title %> <%= link_to '[編集]', edit_task_path(task.id)%> <%= link_to '[削除]',task_path(task.id),method: :delete, data:{ confirm: '削除してもよろしいですか?'} %> </li> <% end %> </ul> <%= link_to '新規追加', new_task_path %> <script> $(function(){ $("input[type=checkbox]").click(function(){ $.post('/tasks/' + $(this).data('id') + '/toggle'); }); }); </script>
data-* が意味するのは、カスタム要素で好きな値が設定できて主にJavaScriptと併用して使用される。
ここでは、jQueryのdata(‘id’)でdata-id に指定されている値を取得している。
data-* を使用しているが、hidden要素などを組み合わせれば
別の方法でも実装は可能なので、
data-* を使わなければいけないというわけではない。
data-* の * 部分は自由となるので
‘data-my-sample-id’ => task.id として
$(this).data(‘my-sample-id’) + ‘/toggle’);
としても動作します。
↑のJavaScriptでは関数名を無名にしていることによって関数式としている
$は省略構文$(セレクタ).メソッド(引数)
チェックしてリロードした時チェックが外れていなければ完成です!