第5回目(10/30)

1.講義メモ

ドメインモデル
・アプリケーションを構築する際の領域(ドメイン)の関係性を表現(モデリング)したものがドメインモデルものがドメインモデル
・ドメインは、何をして何をしないか、を明確にする
・ドメインに存在する関係性を表現することで、システム化する際の機能の単位やシステム自体の仕組みを設計していくことをドメインモデリング

MVCモデルやMVVMモデル

Model:ビジネスロジックを書く場所
View:表示とか入出力について書く場所
Controller:ユーザー処理(リクエスト)によってMとVを制御する場所
ViewModel:MとVの伝達役(中間層の役割)。Viewのための状態を保持する場所

ActionView+ActiveRecord
・画面描画を扱う仕組みがActionView
・ERBテンプレートと呼ばれるHTML形式で記述するものを利用して、動的な画面描画処理を実現できる
・hamlやslimでも記述できる。現場では使われている。
hamlの場合 ​

%html
 %body
    %h1=@title

slimの場合

html
 body
  h1=@title


・Builderテンプレートは、XML形式の生成を得意とする
・RailsをAPIとして使うことが増えている、表示の実装を行わず、ReactやVueを使うことが増えてきている

・ActiveRecordはO/Rアッパーと呼ばれるDBとアプリを紐づけるためのもの
プログラム上で扱われるデータをDBのデータ(SQLクエリ)に変更したり、
その逆を行ったりする

外部ライブラリと構成管理
・外部ライブラリは他の誰かが作った便利機能の集まりのこと
・Gemfileに外部ライブラリを指定する

構成管理ツールとは
・アプリケーションに必要なライブラリや構成を簡単に作成することができる(bundler)
・構成管理には依存関係がある。gemfile.lockが依存関係のファイル
・外部ライブラリはリモートリポジトリに保存されている
・RubyGemsに公開されている

GemとBundler
・Gem=外部ライブラリ。パッケージングされたアプリケーション、モジュールのこと

チーム開発におけるバージョン管理
・運用方法はGit-FlowとGitHub-Flow(ブランチの切り方のルールを決めている)
・GitHub-Flowをカスタマイズして運用することが多い

2.課題

・Ruby on RailsでCRUDのRead処理を実装(画面描画、DBと繋ぐのも含む)
前回と同じ内容だったため、Read以外の処理(追加・更新・削除)を実装しました。コード化してもなかなか動きやその意味まで深く理解できないため調べてみた。

Controller
app/controllers/todo_controller.rb

class TodoController < ApplicationController
 def index
     @msg = 'Todoリスト'
     @data = Todo.all
 end

 def add
   if request.post? then
     Todo.create(todo_params)
     goback
   else
     @adddata = Todo.new 
   end
 end

 def edit
   @editdata = Todo.find(params[:id])
   if request.patch? then
     @editdata.update(todo_params)
     goback
   end
 end

 def delete
   Todo.find(params[:id]).destroy
   goback
 end

 private
 def todo_params
   params.require(:todo).permit(:task,:contents,:start_date,:end_date)
 end

 def goback
   redirect_to '/todo'
 end

end

コードについて
・request.patch? は、「メソッドがPATCHであるか?」を確認する
・patchとputはともにデータを更新するメソッド
 - patchは、データがすでに存在しているものに対して更新をかける処理
 - putはデータが存在しているかどうかわからないときに使用します。データが存在しているときは更新をし、データが存在しない場合は新規作成を行うという処理
・@instance = Model.find(params[:id])は、インスタンス変数を経由することでControllerからViewへ変数を渡すことができる。findはモデルの検索機能を持つメソッド。モデルと紐づいているデータベースのテーブルから、レコードを1つ取り出す場合に使う
・pramsとはRailsで送られてきた値を受け取るためのメソッド。送られてくる情報(リクエストパラメータ)は主に、getのクエリパラメータとPostでformを使って送信されるデータの2つ
・以下の部分について、コントローラーで送られてきたパラメータを安全に受け取る(その仕組みをストロングパラメータ)ため、受け取る値に制限(permit)をかけている

 def todo_params
   params.require(:todo).permit(:task,:contents,:start_date,:end_date)
 end 

・redirect_to は、指定したURLにリダイレクトする。indexページに戻るときに使用する
・削除は、Todo.find(params[:id]).destroy の部分のみ

Views
indexテンプレート:app/views/todo/index.html.erb

<!DOCTYPE html>
   <head>
       <meta charset="UTF-8">
       <title>Todo</title>
   </head>
   <body>
       <h1>Todo#index</h1>
       <p><%= @msg %></p>

       <table border = "1">
           <tr>
               <th>id</th>
               <th>task</th>
               <th>contents</th>
               <th>start_data</th>
               <th>end_data</th>
               <th>edit</th>
               <th>delete</th>
           </tr>
           
           <% @data.each do |obj| %>
           <tr>
               <td><%= obj.id %></td>
               <td><%= obj.task %></td>
               <td><%= obj.contents %></td>
               <td><%= obj.start_date %></td>
               <td><%= obj.end_date %></td>
               <td><a href="/todo/edit/<%= obj.id %>">編集</a></td>
               <td><a href="/todo/delete/<%= obj.id %>">削除</a></td>
           </tr>
           <% end %>
       </table>
       <p Class="link"><a href="/todo/add">
           &lt;&lt; 追加</a></p>
   </body>
</html>

コードについて
・編集と削除の機能を追加に伴い、indexに編集と削除のリンクを追加

addテンプレート:app/views/todo/add.html.erb

<!DOCTYPE html>
   <head>
       <meta charset="UTF-8">
       <title>Todo add</title>
   </head>
   <body>
       <h1>Todo#add</h1>
       <%= form_for(@adddata, url:{controller:'todo',
                   action:'add'}) do |form| %>
           <div class="form-group">
               <label for="task">タスク名</label>
               <%= form.text_field:task,{class:"form-control"} %>
           </div>
           <p></p>
           <div class="form-group">
               <label for="contents">タスク内容</label>
               <%= form.text_area:contents,{class:"form-control"} %>
           </div>
           <p></p>
           <div class="form-group">
               <label for="start_date">開始日</label>
               <%= form.date_field:start_date,{class:"form-control"} %>
           </div>
           <p></p>
           <div class="form-group">
               <label for="end_date">終了日</label>
               <%= form.date_field:end_date,{class:"form-control"} %>
           </div>
           <p></p>
           <%= form.submit "保存" %>
       <% end %>
   
   <p Class="link"><a href="/todo">
       &lt;&lt; トップページに戻る</a></p>
   </body>
</html>

editテンプレート:app/views/todo/edit.html.erb

<!DOCTYPE html>
   <head>
       <meta charset="UTF-8">
       <title>Todo edit</title>
   </head>
   <body>
       <h1>Todo#edit</h1>
       <%= form_for(@editdata, url:{controller:'todo',
                   action:'edit', id:@editdata.id}) do |form| %>
           <div class="form-group">
               <label for="task">タスク名</label>
               <%= form.text_field:task,{class:"form-control"} %>
           </div>
           <div class="form-group">
               <label for="contents">タスク内容</label>
               <%= form.text_area:contents,{class:"form-control"} %>
           </div>
           <div class="form-group">
               <label for="start_date">開始日</label>
               <%= form.date_field:start_date,{class:"form-control"} %>
           </div>
           <div class="form-group">
               <label for="end_date">終了日</label>
               <%= form.date_field:end_date,{class:"form-control"} %>
           </div>
           <%= form.submit "更新" %>
       <% end %>
   
   <p Class="link"><a href="/todo">
       &lt;&lt; トップページに戻る</a></p>
   </body>
</html>

コードについて
・form_forはWebアプリを作る際に使用するフォームを作るための機能
・「form_for」の一つ目の引数はモデルのインスタンスの指定、二つ目の引数はフォームの送信先の指定。二つ目の引数であるurlオプションは、特別な機能を実装したアクションを呼び出したいときに使用する
・フォームの送信先は、url:{controller:'todo',action:'edit', id:@editdata.id})
controller:<コントローラー名>、action:<アクション名>、id:コントローラー側で指定したインスタンス名

画面キャプチャ
追加、編集、削除を実施したキャプチャ

スクリーンショット 2021-11-03 17.23.32

スクリーンショット 2021-11-03 17.23.58

スクリーンショット 2021-11-03 17.24.37

スクリーンショット 2021-11-03 17.24.49

スクリーンショット 2021-11-03 17.25.15

スクリーンショット 2021-11-03 17.25.35

・GitHubにプルリクエストを作る
mainブランチ上で全ての作業を行なったため、PRはせずにリモートリポジトリのURLを共有した。

この記事が気に入ったらサポートをしてみませんか?