【パーフェクト Ruby on Rails】を読む - その10

2-5 ビュープレートについて

2-5-1 ヘルパーメソッドの利用

  • ヘルパーメソッド ViewをよりシンプルにDRYに書くための、Railsで用意されたモジュール。基本的にはviewをhelpしてくれるもの。自分で作ることもできる。

$ rails routesコマンドを打つと表示されるPrefixVerb以下に記載されている部分(例えばuserやprofileなど)に_path_urlなどをviewファイルで付け足す事で、その行きたいviewページまでのurlを簡単に指定することが出来ます。
※ただしコンソール上で試したい時は先頭にapp.profile_urlというようにします。

一部抜粋
- url_for
- link_to
- form_with
- stylesheet_link_tag
- javascript_pack_tag
- time_ago_in_words
- number_with_delimiter


trメソッド

p106 独自ヘルパーメソッドの定義の項目のコード

# app/helpers/application_helper.rb
module ApplicationHelper
  def to_hankaku(str)
    str.tr("A-Za-z", "A-Za-z")
  end
end

全角英文字を半角に変換するヘルパーメソッドでtrメソッド について学びました。
今回の場合はtr("A-Za-z", "A-Za-z")でハイフンの左辺から-の右辺までを指定しています。A-Zで大文字の範囲指定を行い、a-zで小文字の範囲指定を行なっています。大文字と小文字の間に区切りがなかった事で、初見では戸惑いました。

エスケープ処理

フォーム画面にscriptタグなどを書いても基本的には処理されません。これはRails側で守ってくれているのでやらなくても良い事ですが、意図的にエスケープ処理をしないようにする事もできます。

rawヘルパーメソッド

<%= raw "<script>alert('sample');</script>" %>

MVCについてのまとめ

  • Model層について、ActibeRecordの基本的な操作、バリデーション、コールバック
  • Controller層について、ModelとViewを繋ぐこと。リクエストオブジェクトやアクションコールバック、脆弱性への対処。
  • View層について、受け取ったModelを表示すること、テンプレートエンジン、ヘルパーメソッド、さまざまフォーマットでの表示

参照

ヘルパーメソッド
https://qiita.com/Yukaaaah/items/19e524fd0c0e4a3451f1
Ruby 3.0.0 リファレンスマニュアル instance method String#tr
https://docs.ruby-lang.org/ja/latest/method/String/i/tr.html

【パーフェクト Ruby on Rails】を読む - その9

2-3-5 StrongPrameters

想定通りのパラメータかどうかをホワイトリスト方式でチェックする機能です。

  • マスアサイメント
    データベースに保存されるカラムを一括で指定できる機能
  • コントローラーのprivateに記載する

検証ツールなどで想定外の項目を追加して送信された際に、ホワイトリスト以外の人を入店拒否するための機能がストロングパラメータです。

検証ツールを開いて
👨🏻‍💻< admin: true追加したろ!
🖥< えーと…ホワイトリストに:adminはないよ?そんなパラメータは許可してないで!
👨🏻‍💻<なんだってー!

2-4 コントローラーとビューの協調とビューテンプレートの基本

2-4-1 レンダリングまでの流れ

app/views/コントローラー名/アクション名.html.erb

class SurfsController < ApplicationController
def board
end # render記載の省略ができる さらに省略すると def board; end で1行でイケる!

renderとredirect_toの違い

  • render 表示させるviewを指定し表示(controllerに遷移する前の値を保持したい場合はrender)
  • redirect_to URLをもとにviewを表示。(値を保持しない)

redirect_to @userというのが出てきた場合 Railsでは()を省略してくれてる+省略に省略を重ねて上のようになっている 本来は↓なので注意 redirect_to user_url(@user.id)

  • 相対パス そのファイルや行きたい先へのルートを明確に示してあげたものです。
  • 絶対パス そのファイルの住所のみを記載し、道順は示しません。

ひとこと

ホワイトリストってワードは技術書でよく出てくるから知っておいてね

参照

attr_accessor
https://pikawaka.com/ruby/attr_accessor
ホワイトリスト方式セキュリティの仕組みと効果
https://www.hitachi-solutions-create.co.jp/column/security/white-list-security.html
Rails】renderとredirect_toの違いと使い分け
https://qiita.com/morikuma709/items/e9146465df2d8a094d78
redirect_to @userが何を省略しているかわかりますか?〜挫折しないRailsチュートリアル7章〜
https://qiita.com/Kawanji01/items/96fff507ed2f75403ecb

りあクト!輪読会 - その3

プリミティブ値のリテラルとラッパーオブジェクト

JavaScriptではプリミティブ値を定義するときにリテラルを用います。

リテラルとは、英語で「文字通り」を意味し、コードに書いた値がそのまま実行時にもその値のまま意味をもちます。(型定義せずに値の意味を持つ??)

各プリミティブ型に用意されているリテラル
- Boolean型
真偽値リテラル(true、false)
- Number型
数値リテラル
浮動小数リテラル2.1e8 = 2.1 × 10の8乗
- BigInt型
数値リテラル100nは小数点以下を四捨五入する)
- String型
シングルクォオートなどで囲む文字列リテラル
バッククォートで囲むと改行や式展開(${})ができるテンプレートリテラル
- Null型
nullリテラル(nullを返す)

JavaScriptではプリミティブ値にアクセスする時に、対応するラッパーオブジェクトに自動的に変換される。

'Serval lives in savanna'.replace('savanna', 'jungle');
'Serval lives in jungle'

内部でオブジェクトに変換されることにより、プリミティブ型で記述してもメソッドが使用できる。 今回で言えば、'Serval lives in savanna'がプリミティブ型のString型であることを自動判定し、対応するラッパーオブジェクト(rubyのオブジェクトと一緒?)のstringに変換している。

'Serval lives in savanna'.replace('savanna', 'jungle');
//  内部で下記に変換されている。
(new String('Serval lives in savanna')).replace('savanna', 'jungle');

インスタンスメソッドはオブジェクト型でしか使用できない。しかし、ラッパーオブジェクトにより、プリミティブ型をオブジェクト型に変換しているので、インスタンスメソッドが使用できるようになっている。
この変換はJavaScriptが毎回自動的にやってくれるので、普段私たちは意識せずに使用することができる。

ラッパーオブジェクト プリミティブ型
Boolean 真偽値 truefalse
Number 数値 1や2
String 文字列 "文字列"
Symbol シンボル Symbol("説明")

🤔🤔🤔🤔🤔🤔?????😧😧😧😧😧😧😧😧😧😧😧😧

オブジェクト型とそのリテラル

リテラルを持つオブジェクト型 - 配列リテラル - オブジェクトリテラル - 正規表現リテラル

リテラルとは

変数に代入される値のことをリテラルと言います。 そのリテラルの型によって配列リテラルなのか、オブジェクトリテラルなのか、正規表現リテラルなのかが判断されます。

const hoge = "fuga"
//   ↑変数か関数 ↑文字列と認識してるから文字列リテラル
const arr = [1, 2, 3]
//          ↑配列のリテラル


JavaScriptでは、限定的な場面で用いる「オブジェクト」と、広い範囲の意味で用いる「オブジェクト」2種類ある。

①限定的な場面での「オブジェクト」は、キーと値の組み合わせを持つプロパティの集合のことを指す。Rubyでいうハッシュなどもこれに該当する。

プロパティの集合(オブジェクト)は一般的にJSON形式で表したり、用いることが多い。そもそもJSONとはJavaScriptObjectNotation(JavaScriptオブジェクト表記法)の略なので、プロパティの集合がオブジェクトということにも納得がいく。 ↓ JSONさんは「JavaScriptオブジェクト表記法」の略

②広義のオブジェクトはプリミティブ値以外の全ての値を指す。 もっと細くいうと、最終的な標準組み込みオブジェクト(継承元)としてObjectをもっている値。

コンストラクターって何? オブジェクトを生成する関数 newを呼び出す関数がコンストラクタ関数 コンストラクターは、インスタンス化された特定のクラスオブジェクトに属しています。コンストラクターは、そのオブジェクトを初期化し、オブジェクトの非公開の情報にアクセスできるようにします。コンストラクターの概念は、ほとんどのオブジェクト指向プログラミング言語にあります。本質的に、JavaScriptコンストラクターはクラスのインスタンスで宣言します。

文脈で察しろ 🥶

こういう配列の書き方をしたらこういうリテラルになる

""で囲えば文字列だよね ↑ 文字列を文字列として使えることをリテラル

リテラルとは、プログラミングにおいてソースコード中で使用される、数値や文字列等の直に示したデータのことです。
 より厳密に説明すると、プログラム中で常に同じ値をとる定数というものがありますが、定数が指す値のことをリテラルと呼びます。定数は変数のように識別子にデータ、値を代入したものです。例えば、以下のように定義したとします。
const int A=10;
この場合、Aは定数であり、それだけ 指す値10がリテラルです。

ひとこと

むずい

参照

JavaScriptコンストラクターとは?関数とは違うのか?
https://note.affi-sapo-sv.com/js-constructor.php

【図解入門 TCP/IP】を読む - その5

定番プロトコル

各階層に「ほぼこれを使用する」という定番プロトコルが存在しています。
- 有線環境 イーサネット
- 無線環境 IEEE802.11
- ネットワーク層 IP 一択
- トランスポート層 通信の信頼性重視ならTCP リアルタイム性重視ならUDP
- アプリケーション層 HTTP HTTPS QUIC DNS の4択

ネットワークを構成する機器

・前提として

存在するネットワーク機器が全ての階層のプロトコルを見て処理できるわけではない

物理層で動作する機器

物理層は、ケーブルやコネクタの形状、そのピンアサイン(ピン配列)など、物理的な仕様について、全て定義されている階層です。 物理層で動作する機器は、パケットを光/電気信号に変換したり、電波に変調したりする機能を持っています。

NIC
PCやサーバーなどのコンピューターをネットワークに接続するために必要なハードウェア。全てのネットワーク端末は、アプリケーションとOSが処理したパケットをNICを通してLANケーブルや電波に流します。

リピーター
LANケーブルを流れる電気信号は、伝送する距離が長くなるほど減退し、100m近くなると波形が壊れます。リピーターは、それをもう一度増幅して、波形を整えて、もう片方に転送します。これで伝送距離を延ばして、より遠くへパケットを届けられるようにします。(光ファイバーケーブルの普及もあってあまり使われなくなってきています。)

リピーターハブ
受け取ったパケット(ビット)のコピーを、他の全ポートに転送する機器です。

メディアコンバーター
メディアコンバーターは電気信号と光信号を相互に変換する機器です。

メディアコンバーターを私たちなりに例えると

データ(ボール)を届けたくて、ターザンロープ(LANケーブル)でいけるところまで行ったが、着地地点までいけなかったので、その途中を光信号(ぶん投げる)にして遠くまで飛ばして、着地地点に届ける手法。

⛰🚡🤽=✨=>🥎🤲🚡⛰

アクセスポイント
パケットを電波に変調・復調する変換器です。
無線と有線の架け橋になっているので、身近なところではWi-Fiルーターをアクセスポイントとしています。

ひとこと

例え をがんばりました。

参照

本書のみ

【パーフェクト Ruby on Rails】を読む - その8

2-2-4

ルーティングとリソース

resources

resourcesメソッドとは、railsで定義されている7つのアクションのルーティングを自動で作成するメソッドです。 resourcesメソッドを使うことにより、簡単にルーティングを作成することができます。

idを持つルートに限り
それぞれがidを持った個人のページを持ち、URLに表記されるidからページの場所を探してきます。

resource

みんな一意のルーティングでページの場所は一緒になります。表示させる内容はそれぞれviewで変更しているだけです。

memberとcollectionの違い

どちらもルーティングをネストさせる時に用いますが、memberにはURLにidが含まれます。例えば、特定の投稿に対して、ブックマークする時などに使用します。
collectionはURLにidを含みません。
- memberは特定のデータに利用する
- collectionは全体のデータに利用する

例)
collectionは昼会でmemberは特定の誰かを指す。


2-3-4例外処理

何かしらのエラーが起きた時は基本的にRails側でよしなにやってくれているものですが、特定の動きをした時に行なって欲しい例外処理を自分で作ることができます。
そういった場合にはコントローラーにrescue_formを使い記述します。

CSRF対策として、データの変更などのリクエスト時にセキュリティトークンも同時に発行し、それを検証することで自身のアプリケーションからのリクエストであることを証明する手法がとられています。

参照

2021年8月19日 現場Rails Chapterr6 (routes.rbについて)
https://morning-6.hatenablog.com/entry/2021/08/20/093820

【図解入門 TCP/IP】を読む - その4

1.2.4 標準化団体がプロトコルを決める

IEEE

比較的ハードウェア寄りのネットワーク技術の標準化は IEEE802委員会 で研究及び議論されています。
IEEE802の802は、1980年2月に発足したことから付けられた名称です。

IETF

比較的ソフトウェア寄りのプロトコルのほとんどが策定されている。

ハードウェアとソフトウェアの違い

それぞれがお互いの領域に侵食せず、参照するような形で標準化を進めるようになっているため、うまく共存できています。

1.2.5 各階層が連携して動作する仕組み

カプセル化と非カプセル化

送信端末は、アプリケーション層から順に、それぞれの階層でペイロードにヘッダーをくっつけて、PDUにしてから、ひとつ下の階層に渡します。

私たちなりに例えると

送信側でアプリケーション層でPDU(ダンボール)にデータ(ペイロード)を入れてヘッダー(伝票)を貼り、次の層へ違う名前を持たせながら渡していく工程をカプセル化と呼び、受信側では逆に伝票を剥がしながら上の階層へ渡していきます。これをカプセル化と呼びます。


コネクション型とコネクションレス

全部自動でやってくれてるのでユーザーは意識することはありません(すごい!🙌)

・コネクション型

最初に相手に対して 「送っても良いですか?」 と伺って
相手が 「良いですよ」 と確認してからデータを送る(3ウェイハンドシェイク)
しっかりとした手順を踏むため、転送に若干時間がかかりますが、確実にデータを転送する事ができます。
- メリット
確実にデータを転送する
- デメリット
少し遅い


コネクションレス

いきなり相手にデータを送りつけ、勝手に終了する。
- メリット
速い
- デメリット
必ず届くとは限らない

郵便配達をイメージするとわかりやすい。🏣🛵💨


参考

ハードウェアとソフトウェアについて
https://tech-camp.in/note/technology/86966/

【パーフェクト Ruby on Rails】を読む - その7

2-2-4

コールバックによる制御

必ず行いたい前処理後処理を書けます。

before_○○○○○
ahter_○○○○○
around_○○○○○←あんまり使わないかも

ログを残したい場合に条件を自分で設定し作成できます。

ログレベル

ログレベル 名称 内容
0 debug デバッグ情報など
1 info 一般的な情報
2 warn 警告
3 error 制御可能なエラー
4 fatal プログラムをクラッシュさせるような制御不可能なエラー
5 unknown 常に記録されるべき不明なエラー

logger(Rails.logger).leverで設定変更が可能。これは場所を問わない。これを書けば、ログが吐き出される。Railsの記載は省略でき、loggerからで良いです。

2-2-5

enum

数値のカラムに対して別名を与えます。なのでカラムを追加する必要があります。(もしくはmodelかmigrationファイルを作成する)

# db/migration内
add_column :hoge, :category, :integer, null: false, default: 0
# model内
enum category: { bug: 0, request: 1, others: 2 }

enumはモデルに対して定義する必要があります。

enumのメソッドでwhere.notはnotを記載する事で取得する事ができます。

# enumの書き方
Article.not_draft
# これが取得できます。
Article.where.not(status: draft)

2-3-2

フック

コントローラーのアクションの前後に処理を差し込むことができる(コールバックと似ている) onlyexpectを付けることで特定のアクションに対して実行できる。 berore_action :hogehoge, only: [:show, :update]

フック一覧 処理が実行されるタイミング
before_action Actionの実行前
after_action Actionの実行後(正常にActionが実行された場合のみ呼び出される)
around_action Actionの前後
フックのスキップ

例えば、ログインが必要なアプリの時にApplicationControllerに操作を制御するフックを記載した場合、継承先のcontrollerに、skipのクラスメソッドを使用する必要があります。 そうしないと、いつまでもログインができないので注意が必要です。

CSRF適用を無効にしたい時の記述

特定のアクションのみセキュリティトークンの検証を行わないようにするには、下記のように記述します。

protect_from_forgery except: :update

複数のアクションで用いたい場合は配列で記述します。 ですが、基本的によほどのことがない限りセキュリティに穴をあけることになるので無闇に記述するのは辞めましょう。

ひとこと

around_actionなんて知らなかった。

参考

意外と知らないかもしれないRuby, Railsのメソッドとか

https://qiita.com/hc0208/items/45cce0f3f3c843c03c01#increment-decrement
Railsenumを定義している時、自動でscopeが定義される
https://kossy-web-engineer.hatenablog.com/entry/2020/05/31/113615
RailsEnumってどんな子?使えるの?
https://qiita.com/ozackiee/items/17b91e26fad58e147f2e