Tanaka on Rails

行動・努力・俯瞰

今後の方針

37日目まで続けていた「新しい学び」ですが諸事情で削除することにしました。

長らくブログも更新していませんでしたが、これからアプリケーション開発をしていくに当たって学習することはさらに増えていくと思います。

そのためブログを書いて復習する習慣をまた復帰していこうと思っています。

今後は日々の学びの振り返りを「Rail」で更新していきますのでよろしくお願いします😀

MySQL with Rails !

久しく更新しておりませんでした。
学習自体は続けており、ようやくアプリケーション開発を始めました!

スパンは空いてしましましたが、また新たに学んだことやアプリケーション開発をしていく中で学んだことを随時記していこうと思ってます😀

RailsMySQLを使う

Railsで使用したい場合、アプリケーションを作成する際に

$ rails new 〇〇 --database=mysql

とすればOK。
config/database.ymlを確認すると各環境でMySQLを使用するように設定されている。

ただ現状ではMySQLを使用する下地ができているだけで、実際にはまだ作成できていない状態。
DBを作成をするためには

$ rails db:create

とすればOK。

コマンドで中身を確認

よく使いそうなコマンドを列挙。

MySQLに接続

$ mysql -u ユーザー名 -p

DB名確認

$ show databases;

DBを選択

$ use DB名;

テーブル確認

$ show tables;

登録されているデータ確認

$ select * from テーブル名;

参考URL

https://qiita.com/maruyama42/items/a692edac9f5aa4b64786

https://techacademy.jp/magazine/7207

エスケープ回避

エスケープとは?

エスケープ処理とは、プログラミング言語やソフトウェアで文字列を扱う際に、特定の記号文字などに続けて記された文字(の並び)に、その文字本来の意味とは異なる特別な意味や機能を与えること。先頭の特殊な文字を「エスケープ文字」という。

Rails3以降<%= '〇〇' %>を使って出力を行う場合、HTML特殊文字は自動的にエスケープされるようになっているため、文字をありのまま出力したい場合でもエスケープをしてしまう可能性がある。

エスケープを回避するための手段として'〇〇'.html_safesanitize '〇〇'がある。

'〇〇'.html_safe

これを使用することによって、エスケープをせずそのままの文字列を表示できる。
ただ悪意のあるコードなどもそのまま表示してしまうため、安全性はイマイチ。

sanitize '〇〇'

こちらも同様エスケープをせずそのままの文字列を表示できるが、XSS対策もしてくれることによって(XSSとは動的なHTMLを読み込む際に悪意のあるコードが紛れ込んでしまうこと)、悪意のあるコードについてはエスケープされる。

どっちを使う?

なので、システム上であらかじめ準備してある文字列を表示する場合は'〇〇'.html_safe、アプリケーションを使用するユーザが入力したデータを表示する際にはsanitize '〇〇'を使用すればいいと思われる。

参考URL

https://e-words.jp/w/%E3%82%A8%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%97%E5%87%A6%E7%90%86.html
https://www.javadrive.jp/rails/template/index7.html
https://www.y-hakopro.com/entry/2020/01/01/html_safe%E3%81%A8sanitize%E3%81%AE%E9%81%95%E3%81%84
https://qiita.com/kamohicokamo/items/571c58f2d6738a7dfe6a

ステータスコード

ステータスコードとは

そもそもRailsアプリケーションの仕組みは…
①HTTPサーバよりリクエストを受ける、リクエストはparamsで受け取った情報を元とする。
②リクエストをもとにrooterを経てcontrollerで該当のアクションを呼び出す。
③アクションよりmodelを使用しDBからレコードを引き出し、それをアクション内のインスタンス変数などに代入する。
④その情報をviewを元にHTMLを生成。レコードの情報が埋め込まれたHTMLが渡される。
⑤HTTPサーバを通って、HTMLがレスポンスとして送られる。
→すなわちどんな時でも、リクエストがあった時はレスポンスが返ってきて、ステータスコードが表示される!

ステータスコードはサーバーからのレスポンスの結果を表す、3桁の数字コードのこと。

ステータスコードの種類

100番台:情報レスポンス → 処理中の時
200番台:成功レスポンス → 成功した時
300番台:リダイレクションメッセージ → リダイレクトする時
400番台:クライアントエラーレスポンス → クライアント側でエラーが起こった時
500番台:サーバーエラーレスポンス → サーバ側でエラーが起こった時

ステータスコードの構造

プロトコルバージョンやステータスコードを記述した「ステータス行」
レスポンスするデータの情報などを記述した「ヘッダー」
ヘッダーによって定義される「本文」
から成り立つ。

関連するワード

head
headメソッドを使用することで、ヘッダだけで本文のないレスポンスをブラウザに送信できる。headメソッドには、HTTPステータスコードを示す多くのシンボルを引数として指定できる。
例えばcontrollerの条件分岐で失敗した時にhead :bad_requestとするとステータスコード400のヘッダだけのレスポンスが返ってくる。

参考URL

https://railsguides.jp/layouts_and_rendering.html#head%E3%81%A7%E3%83%98%E3%83%83%E3%83%80%E3%81%AE%E3%81%BF%E3%81%AE%E3%83%AC%E3%82%B9%E3%83%9D%E3%83%B3%E3%82%B9%E3%82%92%E7%94%9F%E6%88%90%E3%81%99%E3%82%8B
https://diveintocode.jp/blogs/Technology/ProcessFlow
https://www.itmanage.co.jp/column/http-www-request-response-statuscode/
https://digitalidentity.co.jp/blog/seo/seo-tech/howto-http-status-code.html
https://qiita.com/unsoluble_sugar/items/b080a16701946fcfce70
https://developer.mozilla.org/ja/docs/Web/HTTP/Status#successful_responses
https://developer.mozilla.org/ja/docs/Web/HTTP/Messages#http_responses
https://qiita.com/Knbass/items/d17910c53ffe64dff6a6

bundle exec と bin の違い

$ bin/$ bundle execの違いがよくわからないので調べてみた。

bundle execについて

Gemのパッケージ管理ツールBundlerによって使うことができる。
Gemfileに基づいて実行をするというコマンド。
たとえば$ bundle exec rspecRSpecを実行する際は、アプリケーション内のGemfileに設定してあるバージョンで実行できる。
$ rspecだとローカル環境にインストールされているGemのRSpecを使用することになるため、バージョンが異なったり、インストールされてない場合は実行されない。

binについて

ググってみたがあんまりピンとこなかったが、現場Rails P65 で以下のような記述があり非常にわかりやすかった。

アプリケーションのルートディレクトリ直下のbinディレクトリにあるrailsというスクリプトを呼び出しています。このスクリプトを利用すると、「bundle exec rails」として実行した時と同様に、Gemfileどおりのgemを利用できる環境上でrailsコマンドを実行することができます。
それに加えて、SpringというRailsの起動を効率的に行う機能も組み込まれます。このように、よく使うコマンドを包み込んで使いやすくするスクリプトを「binstub」といいます。

つまりbinディレクトリ以下に設定してあるスクリプト$ bin/railsのように使うことができ、$ bundle exec railsと同じように、そのアプリケーションのGemfileに設定してある環境でコマンドを実行することができるってこと。
また、$ bin/rspecをしてみるとSpring is runningと自動的に設定されることも確認できる。ここが$ bundle execとの違い。

ちなみにrailsコマンドについてはbinをつける必要はないらしい。(つけなくても一緒の挙動らしい)

参考

現場Rails
https://railsguides.jp/initialization.html
https://qiita.com/d0ne1s/items/fa2dafcee02e963fe997
https://github.com/rbenv/rbenv/wiki/Understanding-binstubs
https://techracho.bpsinc.jp/hachi8833/2016_08_24/25037
https://qiita.com/jnchito/items/c5a0848144203dce6e26

環境構築系学び

学び

シェルをbashに変更
echo $SHELLで現在のシェル確認
chsh -s /bin/bashで切り替え
これだとrbenvとnodenvのパスが通ってないので、vi ~/.bashrcをして以下のように記述

export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init - bash)"
export PATH="$HOME/.nodenv/bin:$PATH"
eval "$(nodenv init - bash)"

これでsource ~/.bashrcすれば、rbenvとnodenvを使ってバージョンが変更できるようになる
Rubyの場合はrbenv local ○○
Nodeの場合はnodenv local ○○ で変更可能

Redis
「REmote DIctionary Server」のこと
NoSQL
インメモリなので高速

bundle install --path vendor/bundle
vendor/bundle以下にgemがインストールされる
gemをアプリケーションごとに管理できるため、バージョン違いによって起こる問題を解決できる
.gitignoreに設定していないとgitに大量に変更履歴が残ってしまうため注意

webpack
JavaScript」「CSS」「画像やフォント」といった静的アセットを管理できる
より新しいJavaScriptツールやNPMパッケージとの統合に優れており、より多くのものを統合できる

参考URL

Macのターミナル(シェル)でbashやzsh を切り替える方法 | Hirooooo’s Labo

Macのzshでrbenvを使う - Qiita

Redisとは?RailsにRedisを導入 - Qiita

Webpacker の概要 - Railsガイド