今日の学習
今日学んだこと 2020/12/30
学習項目
GitHubのエラーとテストコードの概要
学習内容
GitHubのエラー
GitHubを使う際に、ブランチせずにマスターブランチで作業してしまう事がある。その場合は、書いたコードをそのままブランチに移行させるか、一度コードの内容を保留(stash)させて行う事ができる。
複数人が同じファイルの編集を行うと、コンフリクトと言うブランチごとの辻褄が合わない事が起こる。こう言った時はうまい具合に統合させるか、片方を削除することになる。コンフリクト自体はよく起こり得るもののため、起こることを想定して編集を進めたり、事前に打ち合わせをするなどの工夫が必要。
誤ってpushした場合は、revertを行い、commitを打ち消す。。 誤ってcommitした場合は、Undoを行い、commitを削除する。
テストコード
RSpecはrailsで主流のテストコード、それ以外にもrailsにはmini_testと言うのがデフォで入っている。
そもそも、テストコードを書く理由としては、アプリケーションのクオリティの
担保になったり、アプリの使用を見極める事ができる。
個人的にはこれから学ぶのが楽しみではある。だって、エンジニアっぽくない?カッコいい。
テストコードには異常系、正常系とパターンがあり、単体テストコードと、結合テストコードと種類がある。
まとめ
テストコードは楽しみ!!GitHubのミスった時はまずは深呼吸して、落ち着く。
今日の学習
今日学んだこと 2020/12/29
学習項目
GutとGitHub
学習内容
GitとGitHub
今日はGitとGitHubについて学んだ。
まず、Gitとはバージョン管理ツールで、GitHubはGitを使って、複数人で開発ができるようにしてくれるWebサービスのこと
Git
Git自体は自身のフォルダやファイルの変更を記録してくれたり、その記録を後を追う事ができるツール。
これだけいうと、わかりずらいが、ざっくりいうとゲームのセーブ機能。
一面をクリア ←セーブ
二面をクリア ←セーブ
一面のあとのイベントをやり忘れた
一面をクリア ←ロード
一面クリア後から再開
こう言ったように時系列ごとに残す事ができ、もちろんロードもできるので、遡って開発をすることもできる。
GitHub
GitHubは複数人で開発ができるようにしてくれるWebサービス。これもわかりづらいので、ゲームで言うと町づくり系のゲームを共同で行う感じです。
例えば、全体で一つの大きな町を作るゲームがあったとして、大元の町をAとして、コピーして、BとCを作ったとする。
Bの町は自宅を整える
Cの町は周りの道を整備する
といったことを別々に作業したとする。
これをGitHubを使うことで、大元のA町にくっつけることができる。そんなイメージです。あんまり、SLG系のゲームしないからうまいゲームが出てこなかった。
使用方法
①まず、リポジトリという変更履歴を保存できるようなものを作る。セーブデータですね。
このリポジトリ自体は、自身のパソコンのものと、サーバーの置くものと二種類ある。前者をローカルリポジトリ、後者をリモートリポジトリ。
②リポジトリを両方に作ったら、作業を分岐するためにコピーを作る。これをブランチと言います。
③それぞれのローカルリポジトリで変更修正を加えたら、コミットをする。これがセーブになる。コミットをしたときは、何をしたのかコミットメッセージを残す。
④コミットが終わった後はリモートリポジトリに反映、アップロードみたいなことをする。これをpush。
⑤んで、各々のセーブデータを組み合わせる。これをmerge。
⑤まとまったデータをローカルに反映させる。これをpull。
一連の流れはこんな感じ。
まとめ
使いこなして、みんなで大きな街を作ろう!!(違うか、、、
今日の学習
今日学んだこと 2020/12/28
学習項目
- 検索機能の実施
- エラーの対処
- アプリケーション開発の手順(概要)
学習内容
検索機能の実施
Twitter等にある検索機能を実施した。
使用するメソッド
主に使うのはwhereメソッドとLIKE句で、この二つを組み合わせて使う。
whereメソッド
モデルが使用できるActiveRecordメソッドの1つ。
モデル.where('検索対象となるカラムを含む条件式')
でテーブル内の「条件に一致したレコードのインスタンス」を配列の形で取得できる。
LIKE句
LIKE句は、曖昧(あいまい)な文字列の検索をするときに使用するもの
実行例 | 詳細 |
---|---|
where('title LIKE(?)', "a%") | aから始まるタイトル |
where('title LIKE(?)', "%b") | bで終わるタイトル |
where('title LIKE(?)', "%c%") | cが含まれるタイトル |
where('title LIKE(?)', "d_") | dで始まる2文字のタイトル |
where('title LIKE(?)', "_e") | eで終わる2文字のタイトル |
これらを使い、実装できる
エラーの対処
rails のエラーの対処はエラー分を読むのはのちろん、pry-railsというGemの機能を利用する事でも行える。
開発手順の概要
アプリケーション開発には、 1. 企画 1. 要件定義 1. 設計 の三つの手順で主に行う。 その後にはデプロイ(公開作業)や保守/運用などがある
今日の学習
今日学んだこと 2020/12/27
学習項目
- 投稿者本人のみに編集・削除を許可する
- 表示順の並び替え
- 複数ページで利用する表示の一部をまとめる
- ルーティングのネストについて
- パラメーターについて
学習内容
投稿者本人のみに編集・削除を許可する
実装方法
編集、削除のアクションに紐付くlink
に対してif文
を入れる。
条件式の内容を投稿内容のid
とログイン中のid
が同一の時のみ表示するという内容にする。
<% if user_signed_in? && current_user.id == モデル.user_id %> <%= link_to '編集又は削除', 'url' method ':HTTP-method' %> <% end %>
user_signed_in?メソッド
Gemのdeviseを導入していると、使用できるメソッド。
ログインしているかどうかの判定を行う。
user_signed_in?メソッドは、ユーザーがログインしていればtrueを、ログアウト状態であればfalseを返す。
current_userメソッド
Gemのdeviseを導入していると、使用できるメソッド。
current_userは、現在ログインしているユーザーの情報を取得する。
上の条件式でログインをしていて、かつ、操作しようとしている投稿が自分の投稿の場合
のみ編集と削除につながるアクションが表示されるようになる。
表示順の並び替え
レコードの取得順を変更する
並び替える方法は、表示のときに順番を変えるのではなく、情報を取得するタイミングで先に並び替える。
orderメソッド
モデルが使用できるActiveRecord
メソッドの一つ。
テーブルから所得してきた複数のレコード情報を持つインスタンスの、並び順を変更するメソッド。
引数には"並び替えの基準となるカラム名 並び順"
のように「並び替えの基準となるカラム名」と「並び順」を半角スペースで繋げて指定する。
使用方法
複数のレコード(列)情報を取得する文に続けて以下のように記述。
インスタンス = モデル名.order("並び替えの基準となるカラム名 並び順")
並び順にはそれぞれAscending/Descendingの略でASC(昇順)とDESC(降順)の2種類。
並び順 | 内容 |
---|---|
ASC(昇順) | 小さいものから大きいものになる。古いものから新しいのものになる |
DESC(降順) | ASCの反対 |
複数ページで利用する表示の一部をまとめる
部分テンプレートの使用法
rails では同じコードを何度も使用する場面がある。例えば、Twitterでは新規投稿と編集のhtmlは同一のものが使用されている。
こう言った部分は別のファイルに切り出し管理をしやすくするのが好ましい。
こういった部分的にビューファイルにおいて繰り返し使用するコードを切り出し、再利用する仕組みのことを部分テンプレートという。
_◯◯.html.erbファイル
部分テンプレートとして切り出す際に作成するファイル。
命名規則として、アンダースコア_
を先頭に記述する。
renderメソッド
部分テンプレート(_◯◯.html.erbファイル
)を呼び出す際に利用する。
呼び出すファイルの指定や、部分テンプレート内で変数を使用したい場合はオプションで指定する。
オプション
partialオプション
で呼び出すテンプレートを指定する。
異なるディレクトリ内の部分テンプレートを呼び出すときはsamples/sample
のように、どのディレクトリの部分テンプレートを使用しているかを明示的に記載する
localsオプション
は部分テンプレート内でその変数を使えるようにする。
<% render partial: "sample", locals: { post: "hello!" } %>
適用方法
1. 添付するファイル(例:` _sample.html.erb `)を作成 2. 切り出したあと1のファイルに添付 3. 切り出されたファイルに <% render partial: "sample", locals: { post: "hello!" } %> と記述
ルーティングのネストについて
通常、コメントだけをデータベースに保存する際、ルーティングには
post 'comments', to: 'comments#create' resources :comments, only: :create
のどちらかを記載するはず。
とはいえ、TwitterやInstagramではそれぞれの投稿に対してコメントができる。このコメントの実装には誰がどの投稿にコメントを残したのか
をわかるようにしなければならない。
その統合自体はアソシエーションで行う事ができるのだが、ルーティングの設定にはひと工夫必要になる。
今日はそのルーティーンのひと工夫(ネスト
)について学んだ。
ルーティングのネスト
まず、そもそもネストとは、ある記述の中に別の記述をして、親子関係を示す方法。「入れ子構造」とも呼ばれる。
ルーティングにおけるネストは、あるコントローラーのルーティングの中に、別のコントローラーのルーティングを記述することをいう。
Rails.application.routes.draw do resources :親となるコントローラー do resources :子となるコントローラー end end
ネストの有無による比較
ネストを利用した場合
Prefix Verb URI Pattern Controller#Action sample_comments POST /samples/:sample_id/comments(.:format) comments#create
ネストを利用しなかった場合
Prefix Verb URI Pattern Controller#Action comments POST /comments(.:format) comments#create
上を見てわかるように、ネストを利用するとその投稿に対して処理をするルーティングが作られる。
パラメーターについて
アプリケーションでは、ブログの文字データやinstagramの画像データなどさまざまなデータを私たちから受け取っている。今日はその外部から送れれてくるデータの使用方法についてまとめる。
外部から送られるデータ
パラメーター
リクエスト(ユーザーが要求すること)に含まれてサーバーの外部から渡されるデータ。
URLに含めるパラメーターやフォームから送信されるパラメーターがある。
Railsのパラメーターはparams
に格納されてコントローラーに届けられる。
params
送られてきたパラメーターをハッシュのような構造で格納したもののこと。
フォームで送信されたデータもparamsの中に格納されてコントローラーで受け取られる。
例えば
model sample_a <%= form_with(model: @sample, local:true) do |form| %> <%= form.text_field :sample %> # "さんぷる"と入力 <%= form.text_field :name %> # "みんてぃ"と入力 <%= form.text_area :text %> # "お疲れさま"と入力 <%= form.submit "SEND" %> <% end %>
こういった形で、送信したとする。
すると、paramsに{sample: さんぷる, ...}といったハッシュのような構造で格納される。
コントローラーでparams[:sample]と記述すると、「さんぷる」というデータを取り出すことができる。
受け取るデータの制限
先程のデータはsample name text
と複数のキーを持っている。コントローラでキーを受け取る際、欲しいものだけ受け取れるように制限をかけることで意図しないデータの更新を防ぐ事ができる。
ストロングパラメーター
ストロングパラメーターは、指定したキーを持つパラメーターのみを受け取るように制限するもの。
ストロングパラメーターの定義にはrequireメソッド
とpermitメソッド
を組み合わせて使用する。
requireメソッドとpermitメソッド
requireメソッドは送信されたパラメーターの情報を持つparamsが、使用できるメソッド。パラメーターからどの情報を取得するか選択できる。
ストロングパラメーターとして使用する場合は、主にモデル名を指定する。
permitメソッドもparamsが使用できるメソッド。
permitメソッドを使用すると、取得したいキーを指定でき、指定したキーと値のセットのみを取得する。
params.require(:モデル名).permit(:キー名, ...) params.require(:sample_a).permit(:name, :text) #=> { "name" => "みんてぃ", "text" => "お疲れさま" }
こうする事でsample_b
というmodelがあったりや、他に送られてきたデータがあったとしても、欲しい情報のみ受け取る事ができる。
ストロングパラメータは、メソッドとして定義するが、コントローラのプライベートメソッドとして定義する。
プライベートメソッド
クラス外から呼び出すことのできないメソッドのこと。
Rubyでは、privateと記述した以下のコードがプライベートメソッドになる。
class Sample_AController < ApplicationController def new @sample = Sample_a.new end def create Sample_a.create(sample_params) end private # private以下の記述はすべてプライベートメソッドになる def sample_params # プライベートメソッド params.require(:sample_a).permit(:name, :text) end end
プライベートメソッドのメリット
Classの外部から呼ばれたら困るメソッドを隔離 プライベートメソッドはClass外から呼び出すことが不可能のため、誤って呼び出してしまう等によるエラーを事前に防ぐことができる。
可読性 繰り返し使用するメソッドもprivate以下に集約する事で、コードをシンプルにできる。
複数の情報をまとめる
基本的なparamsは上記の通りなのだが、例えばTwitterでは、ユーザーの情報とツイートの情報は別々のテーブルに保存されている。こういった場合は情報を結合させる必要がある。mergeメソッド
を使い、情報を一つにする。
mergeメソッド
ハッシュを結合させるときに使用するRubyのメソッド。
2つのハッシュを1つにまとめることができる。
sample = { name: "みんてぃ", text: "お疲れ様さま" } sample_id = { user_id: "1" } tweet.merge(sample_id) #=> {:name=>"みんてぃ", :text=>"お疲れ様さま", :user_id=>"1"}
まとめ
たくさん頑張った!
今日の学習
今日学んだこと 2020/12/25
クリスマスに何してるんだって? 余計なお世話だ!!(笑
学習項目
マイページの実装を通して、異なるテーブルの紐付け-アソシエーションを学んだ
学習内容
Twitterなどは、全てのツイートがただ乱雑に並んでいるわけではなく、誰がツイートしたのかわかるようになっている。
これは投稿内容を管理するテーブル(以下TweetsTable)
とユーザーのテーブル(以下UsersTable)
が紐づいているため。
さらに具体的にいうとTweetsTableのuser_id
のカラムとUsersTableのid
のカラムが紐づいている。
TweetsTableにuser_idを保存する方法
まず、テーブルの紐付けをする前に、TweetsTableに自分のツイート(user_id)を保存する必要がある。
ツイートしているのは誰か、それはまさしくログインしているあなた。 ログインしているユーザーはcurrent_userメソッド
で示す事ができ、これはdeviceを利用している場合使う事ができる。
ツイートを保存する際にmergeメソッド
を使って、ビューから送られてくる情報が入ったparamsと、current_userメソッドで取得したログイン中ユーザーのidを統合して保存させる。
mergeの記載方法
tweet = { name: "たなか", text: "test", image: "test.jpeg" } uid = { user_id: current_user.id } tweet.merge(uid)
異なるテーブルの紐付け-アソシエーション
テーブル同士で関連付けておき、一方のモデルからもう一方のモデルにアクセスできるようへするための概念をアソシエーションという。
定義方法
ユーザー目線からツイートを紐づける場合、一人に対して多数のツイートという構図が成り立つ。
このような「1 対 多数」の関連を示すのがhas_manyメソッド
has_many :tweets (:モデル名-複数形)
対して、ツイート目線から見るとそのツイートには一人のユーザーしか居ないという構図が成り立つ。
このような「1 対 1」関連を示すのがbelongs_toメソッド
belongs_to :user (:モデル名-単数形)
両方とも、関連づけたい models のファイルに記述する。
これでツイートとユーザーが紐づいたので、これを元に各ユーザーのshowページを作れば、各のマイページを作る事ができる。 user のshowページの説明は省きます。。。 ただ、使い方としては、例えばユーザーのアクションで
def show user = User.find(params[:id]) @tweets = user.tweets end
と定義して、ビューファイルで
<%= @tweets.each do |tweet| %> <p><%= tweet.text %></p> <% end %>
と表示すれば、そのユーザーの全てのツイートが表示されます。
パフォーマンス低下を防ぐ
アソシエーションを利用す場合、データベースにアクセスする回数が増える。
理由としてはそのユーザー分データベースにアクセスしようとするため。
これをN+1問題といいincludesメソッド
を使い一度のアクセスで、関連モデルをまとめて取得させる。
記述方法
includes(:紐付くモデル名)、引数に関連モデルをシンボルで指定
モデル名.includes(:紐付くモデル名)
まとめ
何を紐づけるかを考えることって大切。
今日の学習
今日学んだこと 2020/12/24
学習項目
ユーザー登録実装の手順とそれに伴うdeviseの大まかな使い方
学習内容
ユーザー登録実装の手順
- Gemをインストールしてサーバーを再起動
- コマンドを利用してdeviseの設定ファイルを作成
- コマンドを利用してUserモデルを作成
- 未ログイン時とログイン時でボタンの表示を変える実装
- コントローラーにリダイレクトを設定
まず、ユーザー登録機能(ログイン機能)にはdevise
というGemがよく使われている。
インストール方法としては、
- Gemfileを編集し
gem 'devise'
を記述する。 - ターミナルで
bundle install
コマンドを行い、インストール - ローカルサーバーを起動していた場合は、再起動する(Gemの導入状況を変更したため)
Gemをインストールしたあと、deviseを使うために、devise専用のコマンドで設定ファイルを作成する。
# deviseの設定ファイルを作成 % rails g devise:install
設定ファイルの生成が完了後、本格的に作っていくことになる。
大まかに、
- モデル作成
- テーブル作成
- ビューの設定
の三つに分けられる。
モデルの作成は
# deviseコマンドでUserモデルを作成
% rails g devise user
で行い、自動でルーティングの追記、マイグレーションの生成がされるため、そのまま
% rails db:migrate
でテーブルを作成する。
ビューファイルはGemfileにそのまま記述されているが、味気ないらしいので、
% rails g devise:views
を行い、対応している
サインアップ画面: app/views/devise/registrations/new.html.erb
ログイン画面: app/views/devise/sessions/new.html.erb
を編集し、味付けする。
登録に必要な情報を付け足したい場合は、必要に応じて、
% rails g migration Addカラム名To追加先テーブル名 追加するカラム名:型 % rails db:migrate
からカラムを追加する。
パラメーターに制限をかける場合、ストロングパラメーターは`applicationコントローラに定義する。(詳しい方法はまだ理解できていない)
ログインの有無で表示を変る方法は、deviseを導入していると使えるuser_signed_in?メソッド
を使用を使用し、ログインしているかどうかを判定して表示を変える。
この状態のみだと、urlを入れてしまえば意味がなくなってしまうため、最後にリダイレクトを用いて、ログインしていないユーザーに制限をかける。
まとめ
deviceを使いこなすことができれば、ログイン機能を制することができる気がする
自己紹介とブログについて
ごあいさつ
みなさん、おはようございます、こんにちは、こんばんは。
みんてぃと申します。初めての記事ですので、簡単な自己紹介をさせていただければと思います。
自己紹介
今、プログラマーになるためにスクールで勉強中です。将来は、フリーランスとしてまったり働けるようにしていきたいと思ってます。
勉強中の言語は HTML/CSS Ruby Ruby on Rails です。
プログラマーの人はもちろん、いろんな方々と繋がりたいと思ってます。
特に駆け出しの方や、プロの方、フリーで活躍している方とか、ブログを書いている人とか、、、
趣味は、、、ダンスを少ししています。
ブログで書きたこと
このブログでは、勉強したことを日記のように記していきたいなと思っています。 今どこまで理解しているのかと、自分の実力を見つめて行けたらなと。 そして、自身の学んだことをブログを通して共有し、誰かの学習の助けになることができればと。。。 学習内容が間違っていた場合はご指摘いただけると幸いです。
まあ、基本日記になると思います。。。
拙い文章ですが、お付き合いいただければと。