今日のお勉強 0904
2回目のワクチンを打った副反応明け。
・selfとは
まず、モノの設計図がクラス、設計図から生成されるものがインスタンス。
selfは記述する場所によって変わるものの、いずれかのオブジェクト自身を表している。
・ゲッター
```ruby
def hoge
@hoge
end
```
上記のようにクラス内に記述する、インスタンス変数の値をインスタンスから読み取って表示するためだけに定義するメソッド。対の概念としてセッターがある。
・セッター
```ruby
def hoge=(set)
@hoge = set
end
```
上記のように、インスタンス変数の値を更新するためのメソッド。
・レスポンシブデザインとは
閲覧の媒体(=view port)によってサイトの見た目を変えるデザインのこと。
```css
@media (max-width: 500px){
/*** 500px以下の画面で表示時のCSSを記述 ***/
}
```
上記のコードをメディアクエリという固まりで呼び、ここで記述した500pxが表示の分岐点となる。この分岐点をブレークポイントという。
・セッションとクッキー
セッションとはwebサービスの記録を一時的に保存する機能のこと。クッキーとはブラウザが持つセッションの記録の保存領域のこと。railsで用いる際のクッキーのデフォルトの保存先はCookieStoreになっていて、セッションストレージと呼ぶことも一般的になっている。
・JavaScriptの変数
変数はvar,const,letの3種類ある。
varは古い記法で、一度定義した後でも再代入によって値の更新が可能。現場ではあまり使われていない。
constは再代入も再定義もできない、定数のような役割のもの。
letは再代入はできるが再定義ができない。
varで記載してしまうと、途中で値が変わる可能性や、記載前に別の値として定義されている可能性があり、アプリケーションの保守に余計な工数をかけてしまう恐れがあるため、基本的にはconst,letで定義しなければならないと覚えておくこと。
・関数宣言と関数式の違い
関数宣言は
```ruby
function 関数名( 引数 ){
// 関数内の処理
}
```
関数式は
```ruby
変数 = function( 引数 ){
// 関数内の処理
}
```
上記の通りの記述になる。関数宣言は優先的に読み込まれるため関数呼び出しの後に書いてもエラーは出ないが、関数式は通常通り読み込まれるため、関数呼び出しを書く順番に気をつけなければならない。
今日のお勉強0828
・label
特定のテキストを、フォームの部品であるラベルにしてしまう要素。テキストをクリックすることでフォームをクリックするのと同じ動作が実現できる。
・ユーザーのサインイン状況の取得
deviseを導入しているときに限り、user_signed_in?を用いることでサインイン状況の取得ができる。これに応じて表示を変える時は
<% if user_signed_in? %> (ログインしているときの条件式)<% else %> (ログインしていないときの条件式) <% end %>という記述をすると場合分けができる。
・authenticate_user!
deviseによる、ユーザーのサインイン状況に応じて処理を分ける機能の一つ。ユーザーがログインしていない場合にログイン画面に飛ばすなどの機能を持つ。
・before_action
コントローラの全てのアクションが実行される前に何らかの処理をするもの。 authenticate_user!と合わせて、アクセス時にログインしていない場合に真っ先にログイン画面に飛ばすことができる。
・whereの使い方
モデル名.where(条件式)という記述で、モデルの中から条件式に一致するデータを抽出できる。where.notとすることで、一致するもの以外のデータを抽出することができる。
each_with_indexを使った値の検索方法
備忘録。
上記みたいな不規則な配列があったときに、特定の値の有無を返すプログラムを組みたいときにどうしたらいいか。
上記もメソッドと境内を使って、あたいがあれば〜番目にあります、なければその数は含まれていない旨を返す。
①inputに対してeach_with_indexを使う。
これを使うと、input配列に対してnumはindex番目にあります、という情報が出力できるようになる。これ以下にif文を設けて条件を分岐させる。
②どんなif文を書くか
target_numは引数としてきているはずなので実体がある。これに対してinputの各要素(=num)に等しいものがあるかどうかを探すので一行目のような記述になる。
indexは0から始まるので+1して、実態に沿ってにわかりやすいやつにしておく。
③elseは使わない。
eachを使っている都合上、ここでreturnを書かず、かつelseを使うと
その数は含まれていません
その数は含まれていません
その数は含まれていません
その数は含まれていません
その数は含まれていません
その数は含まれていません
その数は含まれていません
その数は含まれていません
その数は含まれていません
その数は含まれていません
その数は含まれていません
などと、ターミナルのメンタルがヘルスすることになるので、一旦returnで処理を終了させる。条件外の場合の処理を書くのはifの外。
後は
などを記述して、あたいの検索をして帰ってくるものを確かめる。
今日のお勉強 0821 テストコードなど
分からないこといっぱい。
・配列の呼び出しコード
note = ["a","b","c"]の各要素を#{}で呼び出したいときは、#{ note[配列番号] }で呼び出す。
・モデルとコントローラーのテストコードの違い
モデルではインスタンスを生成し、モデルに想定した通りの挙動になるかを調べる。データベースとの照合。
コントローラーではアクションにリクエストを送り、想定通りのレスが帰ってくるかを調べる。クライアントとの照合。
テストに必要なデータベースはcreateで保存できるが、一回のテストが実行されるたびにロールバックされ、初期化されてしまう。
・テストコードの実行
bundle exec rspec /パス で実行できる。
・テストコードで〇〇のパスにリクエストを送信するにはget 〇〇_pathを使う。
・レスポンスの有無の確認の仕方
binding.pryで停止させたところにresponse.statusを入力し、出てくる数値で判断する。200が出たら正常に動作している証拠。
expect(response.status).to eq 200
・コンテンツの有無の確認の仕方。
binding.pryで停止させたところにresponse.bodyを入力する。投稿内容等が含まれているかを確認するには特定の値がincludeされているかをexpectを用いて確かめる。
expect(response.body).to include(インスタンス変数の指定)
・visit
実際にそのページへ遷移するためのコード。getはリクエストを送るだけなので、この点で違いがある。
・visitを使うときのマッチャ
実際にそのページに遷移しているときはexpectの引数はpage、マッチャはhave_content('~')で確認する
・検証の際にはfill_in 'フォームの名前', with: '入力する文字列'を用いることでフォームへの入力を行うことができる
・検証の際にはfind('クリックしたい要素').clickを用いることで擬似的にクリック動作を再現できる。
・マッチャにchangeを用いる場合はexpect()ではなくexpect {}になる。要注意。
・expectの中の要素で、current_pathを用いると現在のページのパスの情報を取得できる。
expect(curremt_path).to eq(root_path)で現在のパスがroot_pathであることを確かめられる。
・カーソルを合わせる動作のことをhoverという。find('hoverしたい要素').hoverで再現できる。
・コンテンツがある場合を確かめるにはhave_content、ない場合を確かめるにはhave_no_contentを用いる。
・have_selectorはCSSのセレクタ内に特定の要素があるかどうかを検索するもので、have_content,have_no_contentはページ内の特定の要素の有無を調べるという動きとは全く違うものである。
・have_linkはa要素に対して用いるマッチャ。当てはまるリンクの有無を検索できる。
・要素検索の対象が複数ある場合(すべての要素に同名のクラスが与えられているなど)の時は、findではなくallを用いることで要素を取得できる。その際はall('クラス名')[0]のように記述すると、0番目の〇〇クラスを指定したことになる。
・find_link().clickはa要素で表示されているリンクをクリックするためのコード。find().clickと違ってa要素にしか反応しない。
・テストコードの重複表現はサポートモジュールでまとめることができる。
specディレクトリの配下にsupportというディレクトリを作成し、〇〇_support.rbというファイルを作成することで導入できる。
加えて、rails_helper.rbのsupportに関する部分のコメントアウトを解除し、configの部分にconfig.include (サポートモジュール名)を入力する必要がある。
今日の勉強 0814
しんどいくなって来た。
・railsにおけるアソシエーションとは
モデル間の関連付けに関する概念。例えば、ブログの記事が複数ユーザーで書かれている場合、記事のモデルとユーザーのモデルが存在する。
この状況で、どの記事がどのユーザーによって書かれたかを関連づけるのがアソシエーション。
/モデル同士の親子関係として考える/
ユーザーがそれぞれ複数の記事を持っているのは、当たり前だが「ユーザーは複数の記事を持っている」という状態。
逆に記事から見てみると「記事は誰か一人のユーザーに属している」という状態。
このとき、ユーザーモデルは親となり、記事モデルがモデルが子となるイメージ。これを1:Nの関係というらしい。
・N+1問題
アソシエーションを利用すると、一つのデータを表示するにあたっても複数のDBを経由しなければならない問題から、パフォーマンスの低下につながる恐れがある。これを解決するにはincludeというメソッドを用いる。
・includeメソッド
引数で指定するモデルに対して、全ての情報を一度のアクセスで引っ張り出すメソッド。書き方は↓
モデル名.includes(:モデル名)
コントローラーのインスタンス変数の指定の部分に書き込む。
・NoMethodErrorの解決方法
①コントローラの確認をして、メソッドの定義がなされているかを確認する。
②メソッドが正しく定義されている場合はDB上のカラムに対応する名前があるか確認する
③モデル同士のアソシエーションができているかを確認する
・演算子&&
条件A && 条件Bという記述になっているとき、条件A、B共に真の場合にtrueを返す。
・Orderメソッド
インスタンスの並び替えに使用。
インスタンス = モデル.order("データベースのカラム名 並び順")
ASCで昇順、DESCで降順を指定できる。
・部分テンプレート
_(title).html.erbというタイトルをつけて、<% render partial: "(title)" %>で呼び出す。共通のテンプレートを入れておくと繰り返し記述が減り、コードがスッキリする。
"(title)"の後にlocal: {post:"hello"}などと記入すると、部分テンプレートのなかでhelloという文字の入ったpostという変数が使えるようになる。
・ルーティングのネスト
例えばコメント機能に対して、特定のコメントがどのユーザーに紐づいているかなどを示すためのもの。
コントローラーが入れ子構造になっていて、先に記述されるものが親、後に記述されるものが子になる。いくつでも入れ子にできるが、保守性を確保するためにあまり多くしないことが理想的。
今日の勉強 0813
ジェイソンの日。
どうしてもアプリの仕組みがあやふやになるので最初から復習したい。
・paramsの意味、使い方
railsで送られてきたパラメータの受け渡しをするメソッド。リンク、フォーム、配列・ハッシュでパラメータを受け渡せる。ハッシュのようなもの。これ自体がデータを格納している。
(パラメータとは、リクエストに含まれてサーバの外部から渡されるデータ)
例えば、contentというキーでこんにちわ、というデータを送ったとすると、paramsには{content: こんにちわ}というハッシュみたいな構造で格納される。これをparams[:content]という形で呼び出すことができる。ハッシュの仲間として理解。
・ルーティングの読み方
HTTPメソッド 'URIパターン', to: 'コントローラー名#アクション名'
→URIパターン指定のパスに、HTTPメソッドでリクエストが送られてきたとき、コントローラー名で指定されたものの中のアクション名を呼び出す
URIはURLみたいなもの。
・アクションで指定するインスタンス変数
例えば、indexというアクションがあったとして
def index
@post = "hello world"
end
上記のようなアクションの記載があると、対応するビューで@post(インスタンス変数)が利用できるようになる。
・controller内で同様の記述のメソッドを使うとき
省略のためにbefore_actionというメソッドを冒頭のTweetController~以下に記載
例:before_action :(メソッド名) , onlu [:(コントローラ①),:(コントローラ②)]
今日のお勉強 0812
写真をTwitterのようにアップしてコメントをつけることができるアプリの立ち上げをした。
<新しい概念>
・運用環境の違い
運用環境は大きく3つに分かれていて、環境を使い分けることで効率の良く作業を進めることが出来る。
①developement アプリを開発する際に用いる「開発環境」
②test アプリの動作確認をする「テスト環境」
③production アプリを実際にリリースする際の「本番環境」
今日はdatabase.ymlを使って、エンコードの変更をした。正直何が変わったのかはよくわからなかった。
・リレーショナルデータベース(RDB)
表形式でエクセルのように管理するデータベース。要するにレコードとカラムがあるデータベースだった。これを管理しているのがRDBマネジメントシステム(MS)で、MySQLはこれに該当するものだった。謎が解けた。
ルビーの拡張機能のようなもので、様々な機能を持つ「ライブラリ(=GEM)」を管理するシステム。railsではGEMファイルに必要なGEM名を記載し、'bundle install'をターミナルで実行することによってインストールが始まる。
・CRUD
Create,Read,Upload,Deleteの頭文字。データの取り扱いの基本処理。
・CRUDのアクション
index 一覧表示
show 詳細表示
new 新規作成、生成
create 保存
edit 編集
update 更新
destroy 削除
・resources
上記7つのアクションへのルーティングを自動生成するメソッド。', only: :index'を後に足すことによってindexなど、特定のアクションのみへのルーティングが可能となる。
・アプリケーション共通の見た目は、railsにおいてはapplication.html.erbに指定する。ヘッダーやフッターなどはここに書き込む。yieldというメソッドがその他の要素を呼び出してくれる。
・ストロングパラメーター
意図しないデータベースの読み書きを防ぐもの。requireメソッドとpermitメソッドを利用して作成する。
①requireメソッド
パラメータをどこから取得するか選択するメソッド。
params.require(:モデル名)
②permitメソッド
取得したいキーを指定して、指定したキーとアタイのセットのみを取得する。
params.require(:モデル名).permit(:キー名, :キー名)
・プライベートメソッド
クラス外から呼び出せないメソッドの定義。クラス内に’private’と書いてあると、それ以下の記述は呼び出せなくなる。
・バリデーション
空のデータを登録させないようにするときに使う概念。
alidates :カラム名, バリデーションの種類
ここで種類をtrueにすると空の情報を送信できなくなる。
<要復習概念>
・MVC