michi suzu
    • Create new note
    • Create a note from template
      • Sharing URL Link copied
      • /edit
      • View mode
        • Edit mode
        • View mode
        • Book mode
        • Slide mode
        Edit mode View mode Book mode Slide mode
      • Customize slides
      • Note Permission
      • Read
        • Only me
        • Signed-in users
        • Everyone
        Only me Signed-in users Everyone
      • Write
        • Only me
        • Signed-in users
        • Everyone
        Only me Signed-in users Everyone
      • Engagement control Commenting, Suggest edit, Emoji Reply
    • Invite by email
      Invitee

      This note has no invitees

    • Publish Note

      Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note

      Your note will be visible on your profile and discoverable by anyone.
      Your note is now live.
      This note is visible on your profile and discoverable online.
      Everyone on the web can find and read all notes of this public team.
      See published notes
      Unpublish note
      Please check the box to agree to the Community Guidelines.
      View profile
    • Commenting
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
      • Everyone
    • Suggest edit
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
    • Emoji Reply
    • Enable
    • Versions and GitHub Sync
    • Note settings
    • Note Insights New
    • Engagement control
    • Make a copy
    • Transfer ownership
    • Delete this note
    • Save as template
    • Insert from template
    • Import from
      • Dropbox
      • Google Drive
      • Gist
      • Clipboard
    • Export to
      • Dropbox
      • Google Drive
      • Gist
    • Download
      • Markdown
      • HTML
      • Raw HTML
Menu Note settings Note Insights Versions and GitHub Sync Sharing URL Create Help
Create Create new note Create a note from template
Menu
Options
Engagement control Make a copy Transfer ownership Delete this note
Import from
Dropbox Google Drive Gist Clipboard
Export to
Dropbox Google Drive Gist
Download
Markdown HTML Raw HTML
Back
Sharing URL Link copied
/edit
View mode
  • Edit mode
  • View mode
  • Book mode
  • Slide mode
Edit mode View mode Book mode Slide mode
Customize slides
Note Permission
Read
Only me
  • Only me
  • Signed-in users
  • Everyone
Only me Signed-in users Everyone
Write
Only me
  • Only me
  • Signed-in users
  • Everyone
Only me Signed-in users Everyone
Engagement control Commenting, Suggest edit, Emoji Reply
  • Invite by email
    Invitee

    This note has no invitees

  • Publish Note

    Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note

    Your note will be visible on your profile and discoverable by anyone.
    Your note is now live.
    This note is visible on your profile and discoverable online.
    Everyone on the web can find and read all notes of this public team.
    See published notes
    Unpublish note
    Please check the box to agree to the Community Guidelines.
    View profile
    Engagement control
    Commenting
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    • Everyone
    Suggest edit
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    Emoji Reply
    Enable
    Import from Dropbox Google Drive Gist Clipboard
       Owned this note    Owned this note      
    Published Linked with GitHub
    • Any changes
      Be notified of any changes
    • Mention me
      Be notified of mention me
    • Unsubscribe
    # パRails 開始 7:30 ~ 8:30 --- [技術面談対策用HackMD](https://hackmd.io/@j6EwuLTbTKGpps8BsMbWMQ/ByU7hOvpt) --- ### 1/19 - Node.js [Qiita](https://qiita.com/non_cal/items/a8fee0b7ad96e67713eb) ・サーバサイドのJavaScript実行環境 JSはブラウザ上でのみ動ける→Node.jsがあることでRailsにアクセスできる? nodeenv 14.5以降だと新しいJSが 以前だと旧版のJS  裏側で動けるようになる - Node.jsはなぜ必要? - JavaScriptsはWeb上(ブラウザ上、クライアントサイド)で動かすための言語 - Node.jsとはJavaScriptsをローカル上で動くようにするためのソフトウェア - Node.jsを使うと、JavaScriptをRubyやPhytonみたいにサーバーサイド言語として使えるようになる - npm(NodePackageManager)とはrubyでいうbundlerのようなもの、バージョン管理ツール - rails sでローカルが起動した時にサーバー立ち上げ(rackとかミドルウェアも含んで)とwebpackerが自動で走ってくれていたりしてる? - パッケージとは、JavaScriptのプラグインやモジュールのこと - Yarn&npm Rubyでいうgemみたいなイメージ[Qiita](https://qiita.com/non_cal/items/a8fee0b7ad96e67713eb) Yarnは改良版でfacebook発でnpmより新しい - Docker 仮想環境 コンテナ Dockerにはファイルのようなものがあり、そこに環境?を書き込んでおくと いつでもその環境を再現できる。その環境で誰もが実行できるようになる、仮想だからこそ高速 - `gem install rails`を使うことでrailsコマンドが使える ### 1/20 22p~ - bundle exec bundle installされてるgem のバージョンをつかうよーって宣言 - rdefs 参考記事 [rdefs🤔](https://rochefort.hatenablog.com/entry/20110511/p1) `gem install rdefs`してから相対パスで使用 `$ rdefs app/controllers/articles_controller.rb`など… class module def の宣言名がバーっとでてくる。宣言名のみしかでてこない!Vimmerがさらさらっと確認してそう - Coc 基本的ないわゆるCRUD?の構造など、予めの規約に従うことで構成に注力しなくてよい。 - REST URL/URI+httpメソッドで何がしたいかが明確にわかること --- --- ☆技術面接 ・リクエスト/レスポンスを Railsアプリから画面表示されるまでの流れおしえて ・ログイン機能を クッキー セッション使ってせつめいして ・コールバックってなに? →コールバック関数・・・関数のなかに関数があるやつ https://wa3.i-3-i.info/word12295.html →Railsガイドのコールバック https://railsguides.jp/active_record_callbacks.html イベントを補足できるもの?たとえばcreate前とか後とか あらゆるタイミングを指定できるメソッド --- ### ・deleteとdestroyのちがいは? https://railsguides.jp/association_basics.html#dependent **delete**・・・最小限。SQLを直接打ってるようなもの、指定のデータ1つのみを削除 **destroy**・・・Activerecordを介して削除する、関連付けられたモデルも削除 #### dependentオプションの種類: `:destroy`、`:delete`、`:destroy_async`、`:nullify` - `:destroy` 関連したやつ全部消える 無理心中 - `:delete`(has_manyだと:delete_all?) SQL操作のみてきな挙動。関連したやつ消えない。指定したやつのみが消える みなしご親の名前はのこる - `:destroy_async` 非同期で削除する 何か色々手順あるっぽいけど、めちゃくちゃ削除処理が重い時はこれ使うのを検討すれば良いとかじゃないかな(たにさん) :nullify 指定されたモデルは消え、関連しているモデルの外部キーにNULLがはいる(NOTNULL制約ついてるとROLLBACKする) みなしご 親の記憶は抹消される https://dorarep.page/articles/rails-dependent https://railsguides.jp/association_basics.html#has-one%E3%81%AE%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3-dependent https://qiita.com/takayuu276/items/b86ac6b620d2b15c0164 >ex. >**親モデル** `parent has_many :children` >**子モデル** `child belongs_to :parent` 親オブジェクト(id: 1, name:いずみ) 子オブジェクト(id: 1, name:肉しゃん, parent_id: 1) があったとする >**☆親モデル** `parent has_many :children, dependent: :delete_all`にしたとき、 親モデルdestroyすると子オブジェクトにはなんら影響しない `(id: 1, name:肉しゃん, parent_id: 1 のまま)` ※nullifyは↑でいうと子オブジェクトのparent_id: NULLになるイメージだが、NOTNULL制約が付いているとdestroyしようとするとNotNullViolationでROLLBACKする。そんなときは子モデルの方で `belongs_to :parent, optional: true`とすることで外部キーにnullが入ることが許容されるようになる https://qiita.com/takuyanin/items/6f6be86d1265be21bf9e dependentオプションどれを使うかははケースバイケース(たにさん) --- ### 1/21 27p~ #### binstub - binディレクトリに用意されているファイルのことをbinstubと呼ぶ。`bundle exec`コマンドをつけなくても実行できる。 - ラッパースクリプトを動かすためのファイル、アプリケーションごとにファイルやコマンドを管理するために用います。 - spring ギアの重い自転車を漕ぐ初動を軽くする為に、前もって漕いでくれている装置というイメージと考えられます。 binディレクトリ配下のコマンドを常に起動できる状態にしておくイメージです。 二回目以降のbin/railsやbin/rakeコマンドの起動時間が短縮されます。 - puma・・・アプリケーションサーバー(他にUnicornなどがある,Railsでは標準装備)Pumaは高速化と並行処理のために作成されている - Webサーバーとは・・・webサーバーはユーザーから送られてきた自サイトへのリクエストを受け取り、なんらかの処理を加えるプログラムです。 - アプリケーションサーバーとは・・・アプリケーションサーバーはあなたのRailsアプリケーションを動かしているものです **参考記事** [binstubを理解する](https://techracho.bpsinc.jp/hachi8833/2016_08_24/25037) [Rails: Puma/Unicorn/Passengerの効率を最大化する設定(翻訳)](https://techracho.bpsinc.jp/hachi8833/2017_11_13/47696) http://www.code-magagine.com/?p=7331 - Rubyのselfについて説明して下さい・どんなときに使いますか・・・ Rubyのselfとは、オブジェクトそのものを指しています https://techacademy.jp/magazine/18706 Q27: Rubyのselfはどんなときに使うかを説明してください クラスメソッドの定義や呼び出しではselfを使う クラス内ではselfを用いて現在のクラスを参照する、つまり、あるクラスメソッドから(訳注: 同じクラス内の)別のクラスメソッドを呼び出すときに必須となる インスタンスからクラスメソッドを呼び出す場合はself.class.methodという呼び出し方法が必須となる https://techracho.bpsinc.jp/hachi8833/2020_05_13/91211#6 https://docs.google.com/spreadsheets/d/1Zl7nqbs7CaelaWkL888GZnUtFaLX7-twg3ilQ7LwxAQ/edit?usp=sharing - Rubyのゲッターとセッターについて説明してください Rubyではゲッター(getter)を用いてインスタンス変数を参照でき、セッター(setter)を用いてインスタンス変数に値を設定(書き込む)できます。 ゲッターメソッドやセッターメソッドは、以下のように手動で定義することもできます --- ### 1/22 34p~36p - rails db console (rails dbでも可) たたくとDBに接続する。SQLをうてば該当のデータが表示される `SELECT * FROM users;` https://qiita.com/k-o-u/items/a9b5e5472ba8415dd1aa --- ### 1/24 36p~41p - 内部DSL(Domain Specific Language) https://gihyo.jp/admin/feature/01/dsl/0001 DSLは,メタプログラミングで使われます。 メタプログラミング・・・ メタプログラミングとは、別のプログラムを生成できるプログラムを書くことです。 おそらく、『migrateファイルはこのファイル内のみで完結するよ。外部に影響させないよ。Rubyファイルだと思って良いよ』的な事を言いたいがために 使われた表現。わかりにくい! --- ### 1/25 42p~ ### 1/26 2章から〜49p~ - アーキテクチャ・・・「構造」とか「構成」みたいなことをカッコつけて言った用語 - コネクションプール・・・ゲストカード貸出型接続方式のこと。接続した状態を最初からいくつか用意しておいて、何か用事がある人にはその接続を貸してあげることで、いちいち接続する手間を減らす機能のこと - モデルの役割のうち、振る舞いに関するコールバックやバリデーションとは?・・・普通にモデルに書くvalidatesとかbefore_actionとか - ビジネスロジック・・・システムにおける実際のお仕事部分のこと。そのシステムにおける、システム固有の処理を行う部分……的なニュアンスだけど具体的に何を指すかは結構あいまいで、みんな何となくのフィーリングで使っている用語。 - Active model・・・多くのモジュールを含むライブラリ。モデルじゃないけどモデルみたいに扱いたいときに使うやつ。formオブジェクトがまさに。 - 例:「MVCを説明してください」 - M ... データベースとの接続に対する操作、およびビジネスロジックを記載するところ - V ... Modelを参照し視覚表現を行うところ - C ... Modelのロジックを呼び出し、必要なViewの選択などといったModelとViewとをつなぐところ ### ActiveRecord >Active Recordとは、MVCで言うところのM、つまりモデルに相当するものであり、ビジネスデータとビジネスロジックを表すシステムの階層です >Railsのモデルで、RailsからSQLを簡単な記述で操作できる便利なもの [ActiveRecordとは(Railsガイド)](https://railsguides.jp/active_record_basics.html) --- [モジュール・パッケージ・ライブラリの違い](https://qiita.com/yutaro50/items/f93893a2d7b23cb05461) [モジュールとは](https://medium-company.com/%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB/) - **モジュール** ... 部品を意味する言葉であり、部品単独でも動作することは可能だが、他の部品と組み合わせて使用するもの - **パッケージ** ... モジュールの集まったものがパッケージとなります。 - **ライブラリ** ... ある特定の機能をもったプログラムを、他のプログラムから呼び出せるように部品化したものです ※モジュール < パッケージ < ライブラリ みたいな感じ - **コンポーネント** ・・・ 部品単独では使用せず、他の部品と組み合わせて使うもの - モジュールはなぜつかう?クラスとは違う?・・・クラスは継承ができる(コントローラーだとアプリケーションコントローラ)モジュールだとそういった概念なし、includeかく > クラスはインスタンス化能力をもちメソッドを定義できる、モジュールはインスタンス化能力を持たないがメソッドを格納できる。モジュールの利用法はメソッドを格納するか名前空間として利用する。 [クラス・モジュールの概念(qiita)](https://qiita.com/fukumone/items/2dd4d2d1ce6ed05928de) [classとmoduleの違い(TechAcademy)](https://techacademy.jp/magazine/45608#:~:text=class%E3%81%A8%E3%81%AF%E3%80%81%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%92,%E8%A4%87%E6%95%B0%E9%9B%86%E3%81%BE%E3%81%A3%E3%81%9F%E3%82%82%E3%81%AE%E3%81%A7%E3%81%99%E3%80%82) [Railsチュートリアル(古い方)](https://railstutorial.jp/chapters/rails_flavored_ruby?version=4.2#sec-a_class_of_our_own) [superクラスとは](https://techtechmedia.com/super-overwrite-ruby/) classは工場、モジュールは部品 classはインスタンス生成が出来る(.newとか)けどmoduleはできない。 formオブジェクトはクラス、であってモデルではない。モデルのように扱いたいのでActive RecordのモジュールであるActive Modelをインクルードしている --- 通常のモデル`(quote.rb)→class Quote < ApplicationRecord`で、`application_record.rb`で`class ApplicationRecord < ActiveRecord::Base`を継承している。アプリケーションコントロ−ラーみたいな?  ApplicationRecordはパパ👨🏻 ActiveRecordはジーちゃん👴🏻 ```ruby= $ rails c Running via Spring preloader in process 32510 Loading development environment (Rails 6.1.4.1) [1] pry(main)> ApplicationRecord.superclass => ActiveRecord::Base [2] pry(main)> ApplicationRecord.superclass.superclass => Object [3] pry(main)> ApplicationRecord.superclass.superclass.superclass => BasicObject [4] pry(main)> ApplicationRecord.superclass.superclass.superclass.superclass => nil [5] pry(main)> ApplicationRecord.superclass.superclass.superclass.superclass.superclass NoMethodError: undefined method `superclass' for nil:NilClass from (pry):5:in `__pry__' [6] pry(main)> ``` --- ### 1/28 53p~57p - find・・・見つからなかったら例外 - find_by・・・見つからなかったらnil - where・・・見つからなかったら空のActiveRecord::Relation[]がかえる - ### Query Interface - Active Recordのメソッド(select、where、limitなど)のこと。 - ActiveRecord::Relatiion - SQLのそれぞれの表現に対応したメソッドをチェーンみたいに繋げていくことが可能です。(例:`Book.where("price>?", 3000).limit(3).order(:name)`みたいな感じ) - 実行結果のデータを普通の配列と同じような感覚で扱えます。 https://tech.smarthr.jp/entry/2021/11/11/151444 なんで配列風なの?→メソッドチェインに対応させるため。where().limit.orderで3回SQLが呼ばれる事無く、1回呼ばれて配列のようにデータが保持されて、それをもとにlimitやorderが実行できる - to_a - 任意のタイミングでクエリ発行する時に使う > そもそも、SQLのクエリが発行されるのはviewファイルでインスタンス変数が呼ばれた時。 > `@book = Book.where("price>?", 3000).limit(3).order(:name)` > という`@book`のインスタンス変数がviewファイルに記載された時に(eachとか)クエリ発行する。 > ただ、もっと前に配列を取得し破壊的に[値を追加したい(pushメソッド)]とか何かしらコネコネしたい時にto_aでメソッドを使う https://scoutapm.com/blog/three-activerecord-mistakes-ja --- ### 1/31 57p~ 通常のクラスメソッドで対象が"無し"のとき - find・・・RecordNotFound - find_by・・・nil - where・・・空のActiveRecord::Relation(nilではない) - scopeでクラスメソッド↑を空になるように定義した場合、 ・findだとscopeはつかえない   find単体でも!を使った時と同じ挙動をするので必ず例外がかえってしまう ・whereだと空のActiveRecord::Relationがかえる(nilではない) ・find_byだとnilがかえるはずだけどscopeの場合はnilだと条件が無視とみなされallがよばれる。 ```ruby= scope :find_id, ->(id){find_by(id: id)} scope :where_id, ->(id){where(id: id)} ``` ```ruby= irb(main):018:0> Quote.find_id(50) #allがよばれる!(id50はそんざいしない) Quote Load (0.2ms) SELECT "quotes".* FROM "quotes" WHERE "quotes"."id" = $1 LIMIT $2 [["id", 50], ["LIMIT", 1]] Quote Load (0.2ms) SELECT "quotes".* FROM "quotes" LIMIT $1 [["LIMIT", 11]] => #<ActiveRecord::Relation [#<Quote id: 2, title: "失恋の悲しさ", quote_image: "3.jpg", opposite_voice: "28eda1a2-457f-4407-a80f-e9f86f9feb25.wav", emotiong", opposite_voice: nil, emotion: "happy", created_at: "2021-12-20 06:16:58", updated_at: "2021-12-20 06:41:30">, #<Quote id: 5, title: "喜び:スポ根", quote_image: "喜び_スポ根もの.png", opposite_voice: nil, emotion: "happy", created_at: "2021-12-20 06:42:05", updated_at: "2021-12-20 06:42:05">, #<Quote id: 7,>, #<Quote id: 8, title: "怒り:怒ったぞ", quote_image: "本文を追加__7_.png", opposite_voice: "def7f90f53769447.mp3", emotion: "angry", created_at: "2021-12-31 04:16:22", updated_at: "2021-12-31 04:21:30">, #<Quote id: 4, title: "喜び:ずっと食べたかったやつ", quote_image: "喜び_ずっと食べたかったやつ.png", opposite_voice: "スペシャルサンドnew.mp4", emotion: "happy", created_at: "2021-12-20 06:17:47", updated_at: "2022-01-05 11:17:11">, #<Quote id: 6, title: "喜び:使い魔と魔王", quote_image: "喜び_使い魔と魔王.png", opposite_voice: "きひひnew.mp4", emotion: "happy", created_at: "2021-12-20 06:42:32", updated_at: "2022-01-05 11:27:45">, #<Quote id: 9, title: "嫌悪: 言ってみたいモブキャラセリフ", quote_image: "本文を追加__17_.png", opposite_voice: "Record__online-voice-recorder.com___8_.mp3", emotion: "disgust", created_at: "2022-01-11 05:08:03", updated_at: "2022-01-11 05:13:42">, #<Quote id: 11, title: "驚き: 相棒がゾンビ化", quote_image: "本文を追加__20_.png", opposite_voice: "ゾンビ.mp4", emotion: "surprise", created_at: "2022-01-14 04:24:59", updated_at: "2022-01-14 04:24:59">, #<Quote id: 12, title: "喜び: 笑って引退したい", quote_image: "本文を追加__24_.png", opposite_voice: "Record__online-voice-recorder.com___15_.mp3", emotion: "happy", created_at: "2022-01-16 08:30:47", updated_at: "2022-01-16 08:32:55">, ...]> irb(main):019:0> Quote.where_id(50) Quote Load (0.3ms) SELECT "quotes".* FROM "quotes" WHERE "quotes"."id" = $1 LIMIT $2 [["id", 50], ["LIMIT", 11]] => #<ActiveRecord::Relation []> irb(main):020:0> Quote.where(id: 50) Quote Load (0.4ms) SELECT "quotes".* FROM "quotes" WHERE "quotes"."id" = $1 LIMIT $2 [["id", 50], ["LIMIT", 11]] => #<ActiveRecord::Relation []> irb(main):021:0> ``` [scope](https://railsguides.jp/active_record_querying.html#:~:text=%E6%8C%87%E5%AE%9A%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82-,14%20%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%97,-%E3%82%88%E3%81%8F%E4%BD%BF%E3%81%86%E3%82%AF) #### ActiveRecord::Relation [Rails API](https://api.rubyonrails.org/classes/ActiveRecord/Relation.html) ActiveRcord::Relationはモジュール部分であり、ざっくりと何をしているかというと - クエリを生成するための条件を持っておいて、必要に応じて適切なSQLクエリを生成・発行してくれる - その結果からオブジェクトを作って返したり保持したりしてくれる > SQLのそれぞれの表現に対応したメソッドをチェーンみたいに繋げていくことが可能です。(例:Book.where("price>?", 3000).limit(3).order(:name)みたいな感じ) 実行結果のデータを普通の配列と同じような感覚で扱えます。厳密には配列ではないので注意!(例えば配列に使えるpushはつかえない) [参照](https://spirits.appirits.com/doruby/8831/) [Qiita](https://qiita.com/kichion/items/a1539fcb124b69c765bf) --- https://runteq.jp/v2/mypage/interview_trainings/427 https://runteq.jp/v2/mypage/interview_trainings/428 https://www.youtube.com/watch?v=tXSRkNiOyV8 https://www.youtube.com/watch?v=zL6DYg7WDnk&t=1s ★自己紹介:いやご経歴素晴らしいんですが、硬い!不動産の話カットしてエンジニア希望してポートフォリオ作って結果出しましたって話しちゃっても良いような気がしました(不動産の話ちょっと昔すぎるかなーと思いまして。ポートフォリオ突っ込みたくなる人もいると思うので、自己紹介で「経理だけどエンジニアっぽいことしてる」「ポートフォリオで面白いサービス作った」ことを餌をまいておいて、その後相手がつっこみたい事をつっこませたいのです ★声優なるための期間のお仕事(経理):これ普通にすごいと思ったんですよね。不動産業で経理やってたとしても、不動産業でしているのはメインは宅建事務であって、そこからメイン経理な仕事にいくって大変さはあると思います。なので、そこは謙虚にならずアピールしていいと思いますよ! ★Mipoxさんの経理:上場会社のメーカーでしかできない花形業務、とかより東山さんの実績を伝えてほしいので、①2〜3ヶ月という短い期間で連結決算を任せられるために頑張ったこと ②①が無ければ経理ながらエンジニアっぽいことしていた話 をしてほしいです! ★Mipox退職理由:エモい話なのでここはテンション上げてほしい!笑 ★今後のキャリアの話:ここもエモい話なのでテンションあげてほしい!笑 ★RUNTEQで頑張ったこと:ここは頑張ったことを答えてほしいんですが、それ以上に東山さんのアピールになるといいと思います。 ★ポートフォリオに関して:ここすごくお伺いしていて楽しかったです!セリフ考えていた話とか、平均的に10ページ見てくれてる話とか、すごい面白かったです! ★今の経理の大変さの話:これも面白かったです〜!多分これをベースに業務効率化とかの企業見てってもいいかもっすねー! 全体的に自分が東山さんを知っているだけに、もったいないなーと感じました! 絶対に練習すればいつもの東山さんでいけると思うので、頑張りましょ〜! --- ### 2/1 59p~63p - 外部キー制約・・・主キーと外部キーを使った制約で利用した場合、下記の制限が入る。 1. 存在しない値を外部キーとして登録することはできない 2. 子テーブルの外部キーに値が登録されている親テーブルのレコードは削除できない(オプションでdependent: :destroyを書くことで削除できる) https://qiita.com/kamillle/items/5ca2db470f199c1bc3ef 60pの下のブロック意味不 ![](https://i.imgur.com/d4Fovg6.jpg) マイグレーションファイルのnot nullをadd_referenceに書こうとすると↑のundefinedのように、railsからみて、そもそもpublisher_idそのものが見つからないような状態になるのでエラー。(db migrateをすればたしかにpublisher_id出来るけど、この時点では) そのため、明示的にこれからカラムが出来るんだよということを教えるためにchange_columnという形で行をわけてnot nullを書く。 ``` ruby= # 2xxxxxxxxxxxxx_add_publisher_id_to_books.rb 略 def change add_reference :books, :publisher, foreign_key: true #rails g migration時にreferencesをつけた事により外部キーであるforeign_keyが生成されており、この行でpublisher_idが作られます。(注:publisher_idとこの行で書いてしまうとpublisher_id_idとなってしまいます。) change_column :books, :publisher_id, :integer, null: false #ここで1行目に生成されたpublisher_idにnull: falseをつけることでnot null制約を付与しています。 ``` ### 2/3 63p~66p - 1対多の場合、belongs_to側に外部キー作る? - 親のhas_many側に絡む作っちゃうとマルチカラムアトリビュートになっちゃう。1のほう、belongs_toを書いてる側に外部キー書かないと。 - 参照:[Railsガイド](https://railsguides.jp/association_basics.html#:~:text=belongs_to%E3%81%A7%E3%81%AF%E3%80%8C%E5%8F%82%E7%85%A7%E3%81%AE%E4%B8%80%E8%B2%AB%E6%80%A7%E3%80%8D%E3%81%8C%E6%8B%85%E4%BF%9D%E3%81%95%E3%82%8C%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82%E3%81%9D%E3%81%AE%E3%81%9F%E3%82%81%E3%80%81%E3%83%A6%E3%83%BC%E3%82%B9%E3%82%B1%E3%83%BC%E3%82%B9%E3%81%AB%E3%82%88%E3%81%A3%E3%81%A6%E3%81%AF%E4%BB%A5%E4%B8%8B%E3%81%AE%E3%82%88%E3%81%86%E3%81%AB%E5%8F%82%E7%85%A7%E3%82%AB%E3%83%A9%E3%83%A0%E3%81%A7%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%83%AC%E3%83%99%E3%83%AB%E3%81%AE%E5%A4%96%E9%83%A8%E3%82%AD%E3%83%BC%E5%88%B6%E7%B4%84%EF%BC%88foreign_key%3A%20true%EF%BC%89%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B%E5%BF%85%E8%A6%81%E3%81%8C%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82) - 中間テーブル・・・関連"多対多"が入ると必ず中間テーブルが必要? - nullにならないようにするために中間テーブルでIDを管理するために便利 - 参照:[やさしい図解で学ぶ 中間テーブル 多対多 概念編 Qiita](https://qiita.com/ramuneru/items/db43589551dd0c00fef9) - has_oneのとき、外部キーはどっちも持つ?・・・一方がhas_oneであれば一方はbelongs_to - ↓によるとhas_oneが自然なほうが持つ(例えばUserとaccountの場合userがhas_oneしている方が自然) [Rails Association 1対多,1対1について。Qiita](https://qiita.com/s_tatsuki/items/9a875a9cf486172b8ead) - [双方向関連付:Railsガイド](https://railsguides.jp/association_basics.html#:~:text=end%0A%20%20end%0Aend-,3.5%20%E5%8F%8C%E6%96%B9%E5%90%91%E9%96%A2%E9%80%A3%E4%BB%98%E3%81%91,-%E9%80%9A%E5%B8%B8%E3%81%AE%E9%96%A2%E9%80%A3) ```ruby= class Author < ApplicationRecord has_many :books end class Book < ApplicationRecord belongs_to :writer, class_name: 'Author', foreign_key: 'author_id' end irb> a = Author.first irb> b = a.books.first irb> a.first_name == b.writer.first_name => true irb> a.first_name = 'David' irb> a.first_name == b.writer.first_name => false ``` [belongs_to の foregin_keyオプション](https://railsguides.jp/association_basics.html#belongs-to%E3%81%AE%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3-foreign-key) belongs_to に foregin_keyオプション もしくは has_many through を使用している場合、自動認識がされない(config設定がrails最新バージョンであれば自動認識されるようにはなっている) 自動認識してくれない場合、has_側にinverse_ofオプションを書いておくことで自動認識させることが出来る - inverse_ofとは inverse_ofを指定したリレーションのある2つのモデルでは、双方から同一のインスタンスを参照できるようになる。両者ともメモリ上で同一のインスタンスとして扱われる。 逆に、inverse_ofの設定が無いと同一として扱われず、一方からの変更がもう一方から参照しても変更されていない。 [inverse_ofが使われないワケ(侍エンジニア)](https://www.sejuku.net/blog/66868) ※inverse_ofは一見必要無さそうに見えるけど、 has_many+条件式をscope定義しているときはつけないと自動認識されない!! --- ### 2/4 66p~ バリデーション書いたら`create` `save` `update`に`!`をつけてあげるとエラーメッセージを表示してくれる、例外だと処理がとまるエラー画面。 通常続いてredirect_toなどを書くはずだけど、例外だとその前でとまる。 [バリデーション実行時の動作: Railsガイド](https://railsguides.jp/active_record_validations.html#:~:text=!%E3%81%8C%E6%9C%AB%E5%B0%BE%E3%81%AB%E4%BB%98%E3%81%8F%E7%A0%B4%E5%A3%8A%E7%9A%84%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%EF%BC%88save!%E3%81%AA%E3%81%A9%EF%BC%89%E3%81%A7%E3%81%AF%E3%80%81%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E3%81%8C%E7%84%A1%E5%8A%B9%E3%81%AA%E5%A0%B4%E5%90%88%E3%81%AB%E4%BE%8B%E5%A4%96%E3%81%8C%E7%99%BA%E7%94%9F%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%20%E9%9D%9E%E7%A0%B4%E5%A3%8A%E7%9A%84%E3%81%AA%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%81%AF%E3%80%81%E7%84%A1%E5%8A%B9%E3%81%AA%E5%A0%B4%E5%90%88%E3%81%AB%E4%BE%8B%E5%A4%96%E3%82%92%E7%99%BA%E7%94%9F%E3%81%97%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82save%E3%81%A8update%E3%81%AF%E7%84%A1%E5%8A%B9%E3%81%AA%E5%A0%B4%E5%90%88%E3%81%ABfalse%E3%82%92%E8%BF%94%E3%81%97%E3%80%81create%E3%81%AF%E7%84%A1%E5%8A%B9%E3%81%AA%E5%A0%B4%E5%90%88%E3%81%AB%E5%8D%98%E3%81%AB%E3%81%9D%E3%81%AE%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%92%E8%BF%94%E3%81%97%E3%81%BE%E3%81%99%E3%80%82) https://hackmd.io/coZGaARgSwW15i9vV_tmqQ#save%E3%81%A8save%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%81%AE%E6%8C%99%E5%8B%95%E3%81%AE%E9%81%95%E3%81%84%E3%81%AF%E4%BD%95%E3%81%A7%E3%81%99%E3%81%8B%E3%80%82%E3%81%9D%E3%82%8C%E3%81%9E%E3%82%8C%E3%81%AE%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%81%AF%E3%81%A9%E3%81%86%E4%BD%BF%E3%81%84%E5%88%86%E3%81%91%E3%81%BE%E3%81%99%E3%81%8B%E3%80%82-save%E3%81%AF%E5%A4%B1%E6%95%97%E3%81%97%E3%81%9F%E3%82%89%E3%80%8Cfalse%E3%80%8D-%E3%81%8C%E8%BF%94%E3%82%8A%E3%80%81save%E3%81%AF%E3%80%8C%E4%BE%8B%E5%A4%96%E3%80%8D%E3%81%8C%E8%BF%94%E3%82%8B%E3%80%82-save%E3%81%AF%E5%A4%B1%E6%95%97%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8%E3%82%92%E6%83%B3%E5%AE%9A%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E5%87%A6%E7%90%86%E3%81%AB%E4%BD%BF%E3%81%84%E3%80%81save%E3%81%AF%E5%A4%B1%E6%95%97%E3%81%97%E3%81%AA%E3%81%84%E3%81%AF%E3%81%9A%E3%81%AE%E5%87%A6%E7%90%86%E3%81%AB%E4%BD%BF%E3%81%86%E3%80%82 [RailsのTransactionの使い方](https://qiita.com/huydx/items/d946970d130b7dabe7ec) - create save updateの違いは? ### 2/5 69p~73p [【Rails】一括updateでコールバックを呼べるのか検証してみた](https://qiita.com/ngron/items/6d13e98f1aedde5b30dd) - update_all,update_columnsなどのメソッド (https://www.sejuku.net/blog/65270) update_allは、ActiveRecordオブジェクトを経由しない更新方法のため、バリデーションやコールバックが実行されませんので、注意が必要です。 →ということはSQL直の用な感じ SQLを直実行する [Rails ドキュメント](https://railsdoc.com/page/model_update_all) --- ### 2/5 73p~77p #### Enum型 数値のカラムに対してプログラム上で扱える別名を与えることが出来る。コード上に直接数字を書くマジックナンバーを避けるためでもあり、コード上では分かりやすいシンボルで指定しつつActiveRecord側ではDB上の定義に合わせて保存できる。 ```ruby= enum status: { admin: 0, writer: 10, reader: 20 } # 10飛ばしなどにすることで、後から前後に追加したくなったときにすぐに追加できる ``` - enumerize・・・enumよりも高機能。より複雑な定義をしたいとき。例えば英語と日本語両方定義できたりする、簡単にformでセレクトボックスやラジオボタンが作れるなど [enumeriseの使い方](https://opiyotan.hatenablog.com/entry/rails-gem-enumerize) --- ### 2/8 コントローラの役割 2-3 ```ruby= respond_to to |format| # のようにすると format.html # htmlを返す format.json # json形式で返す end ``` #### フック アクションの前後に処理を差し込むことができるコールバック処理のようなもの これは暗記系 [protect_from_forgery :Railsガイド](https://railsguides.jp/security.html#:~:text=Rails%E3%81%A7%E6%96%B0%E8%A6%8F,%E3%81%95%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82) [CSRFへの対応策 :Railsガイド](https://railsguides.jp/security.html#:~:text=%E3%81%A8%E6%80%9D%E3%81%84%E3%81%BE%E3%81%99%E3%80%82-,3.1%20CSRF%E3%81%B8%E3%81%AE%E5%AF%BE%E5%BF%9C%E7%AD%96,-%E7%AC%AC%E4%B8%80%E3%81%AB%E3%80%81W3C) [RailsのCSRF対策について](https://qiita.com/eshow/items/915f8e8ad317aa8e49a6) - protect from forgery・・・別サイトを横断して、処理をさせないようにトークンを使って対策できるメソッド(form_withと一緒に使ったりする) --- ### 2/10 p84~ -ルーティングの書き方 アロー関数(=>)→ , to: ```ruby delete 'logout', to: 'user_sessions#destroy' ``` - PATCH PUT・・・通常思い浮かぶ編集がPATCH。title変更など。PUTは置き換え、画像アップロードの画像を変えたときなど。 ![](https://i.imgur.com/q3EMB2D.png) - [shallow - Railsガイド](https://railsguides.jp/routing.html#%E6%B5%85%E3%81%84%E3%83%8D%E3%82%B9%E3%83%88) ネストしていたとしても、親の_idが必要ではないアクション→edit、show、update、destroyはURLをスッキリ表示できる。 https://railsguides.jp/routing.html#:~:text=%E3%81%93%E3%81%AEarticles%E3%83%AA%E3%82%BD%E3%83%BC%E3%82%B9%E3%81%A7%E3%81%AF%E4%BB%A5%E4%B8%8B%E3%81%AE%E3%83%AB%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%8C%E7%94%9F%E6%88%90%E3%81%95%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82 member と collection member・・・id必要 collection・・・不要 idの参照が必要か不要か - concern・・・scopeを切り出して再利用するやつ(モデルディレクトリにあるやつ) --- ### 2/14 p88~93p 例外処理はなんとなく雰囲気わかった気がする #### ストロングパラメーター - require モジュールを呼び出していない 外部ファイルを読み込んでいる - include モジュールを呼び出している - permit 引数でフィルタしたカラム(属性)でActionController::parameters(parameterのこと)を新しくつくりなおす。→参照:[API Doc: require](https://api.rubyonrails.org/v7.0/classes/ActionController/Parameters.html#:~:text=show%20%7C%20on%20GitHub-,permit(*filters),-Link) - [railsガイドpermit](https://railsdoc.com/page/parameters_permit) **疑問** >requireじゃなくてincludeでもよくない? >```ruby= >params.require(:post) >``` >paramsはモジュールじゃないからrequireを使う --- >```ruby= >params.require(:post).permit(:title, :body) >``` ```ruby= private def post_params params.require(:post).permit(:title, :content, :last_day, :status) end ``` >parmit(引数) ```ruby= def permit(*filters) params = self.class.new ``` parmitメソッドを使うと引数を使って新しくインスタンスを作ってる感じ?🤔だから引数に渡されたもの以外は「許可しない」ってことになるのか?🤔 > [API doc permit](https://api.rubyonrails.org/v7.0/classes/ActionController/Parameters.html#:~:text=merge(other_hash),params.permit(%3Aname)) [include? :Ruby](https://docs.ruby-lang.org/ja/latest/method/Array/i/include=3f.html) [require :Ruby](https://docs.ruby-lang.org/ja/latest/method/Kernel/m/require.html) [requireとincludeの違い](https://qiita.com/yanap/items/65c3953fb4e52218399a) --- ## 2/15 : p93 2-4~ ```ruby= def show render :show end def show; end # ←これでも意味は同じ ``` render :showでは ・描画するテンプレートを探す ・見つかったテンプレートをもとにデータを展開し最終的なHTMLを生成する - render,redirect_toで:statusをわたす理由 [回数制限APIをつかったときに使う](https://qiita.com/terufumi1122/items/997e24dde87f807e3944) - 🤔 <ワカラン [status ::Railsガイド](https://railsguides.jp/layouts_and_rendering.html#:~:text=2.3.1%20%E3%83%AA%E3%83%80%E3%82%A4%E3%83%AC%E3%82%AF%E3%83%88%E3%81%AE%E3%82%B9%E3%83%86%E3%83%BC%E3%82%BF%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%99%E3%82%8B) ### renderとredirecto_toの違い >renderはcontrollerのactionを経由しない redirect_toは経由する ・render     : controller → view ・redirect_to   : controller → URL → route → controller → view [Railsガイド](https://railsguides.jp/layouts_and_rendering.html#:~:text=%E3%83%AC%E3%83%B3%E3%83%80%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%97%E3%81%BE%E3%81%99%E3%80%82-,2.3%20redirect_to%E3%82%92%E4%BD%BF%E3%81%86,-HTTP%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E3%81%AB) コントローラ側から見たHTTPレスポンス - **renderを呼び出す**: 完全なレスポンスを作成してブラウザに送信する - **redirect_toを呼び出す**: HTTPリダイレクトステータスコードをブラウザに送信する ## 2/17 : p97 2-4-2~ - renderのlayoutオプション [:layoutオプション - Railsガイド](https://railsguides.jp/layouts_and_rendering.html#:~:text=2.2.13.2%20%3Alayout%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3) view/layouts/内にあるlayoutファイルを適用するオプション。通常application.html.erbが呼ばれるがそれ以外使いたいとき。(ex.top.html.erb→ render layout: "top") [実際に使う時のイメージ](https://pikawaka.com/rails/layout#renderメソッドで指定) [layoutメソッド Pikawaka](https://pikawaka.com/rails/layout) 実際に現場で使われるかは分からない(フロントとバックエンドで分かれている場合があるのでガチガチのRailsでブログサイトを作るときは使えるかもね) [:variants オプション](https://railsguides.jp/layouts_and_rendering.html#:~:text=2.2.13.6%20%3Avariants%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3) [ユーザーエージェント (UA)](https://wa3.i-3-i.info/word1452.html) ※UAの情報はどうやって判断してる?→ユーザーからのHTTPリクエストヘッダーに書いてある(検証ツール使うやつ) ↓スマホ ![](https://i.imgur.com/cPpGa1l.png) ↓PC ![](https://i.imgur.com/QWiN64x.png) --- ## 2/18 : p102 2-5~ - クエリパラメータ・・・クエリパラメータとは URLの?以降に続く部分のことを指します [【Ruby on Rails】クエリパラメータを扱う](https://note.com/matsukoutennis/n/n484cfbf51c1a) ↓これを 基礎編boards_indexのViewに書くと・・・ <%= link_to "るーと", root_path(食べ物: "りんご")%> ![](https://i.imgur.com/gceDED7.png) ![](https://i.imgur.com/Lq0aHCh.png) - 2-5-2:エスケープ処理とは? ```ruby= $("#js-board-<%= @board.id %>").replaceWith("<%= j(render('boards/bookmark', board: @board)) %>"); ``` この```j(render)```の部分の`j`がエスケープ処理をしている。 - [API doc](https://api.rubyonrails.org/classes/ActionView/Helpers/JavaScriptHelper.html#method-i-escape_javascript) [[Rails] scriptタグ内でRuby/Railsのメソッドを使用する際のescape_javascriptについて](https://qiita.com/eitches/items/290d3e1a8ca33f849ed6) ↑🤔は? j render(escape_javascript)→''""や改行をエスケープするやつ→JQueryのなかの<%=内でつかってる→Ruby記法だから **JavaScriptとしての**`''""`**じゃないんだからね!!**/// ってこと? ## [j の部分のgithub](https://github.com/rails/rails/blob/2459c20afb508c987347f52148210d874a9af4fa/actionview/lib/action_view/helpers/javascript_helper.rb#:~:text=JS_ESCAPE_MAP%20%3D%20%7B,alias_method%20%3Aj%2C%20%3Aescape_javascript) ```ruby= JS_ESCAPE_MAP = { "\\" => "\\\\", "</" => '<\/', "\r\n" => '\n', "\n" => '\n', "\r" => '\n', '"' => '\\"', # ←このバックスラッシュなんなん? "'" => "\\'", "`" => "\\`", "$" => "\\$" } ``` ってことで、`\`がjsにとってなんの作用があるのか? ### [JSでの \ の意味は? :JS PRIMER](https://jsprimer.net/basic/string/#:~:text=%E3%81%A9%E3%81%AE%E6%96%87%E5%AD%97%E5%88%97,%E5%AE%9F%E8%A1%8C) ```javascript= const str = "This book is \"js-primer\""; console.log(str); // => 'This book is "js-primer"' ``` ↑文字列の中に""が重複していてもバックスラッシュ書いたらちゃんと認識してくれている! --- ### 2/19 p110~ APIモードの時にJSONを返す場合、`jbuilder`という`gem`を使うことで`render json: @book`とするよりもjsonで取って来たい情報の抽出条件を細かく指定できる extractは"抜粋"の意味 extract!と書かないと通常のキーとして認識してしまう [extract!について :Pikawaka](https://pikawaka.com/rails/jbuilder#json.extract!) - jbuilderってgemがあるんだなー - pikawakaさんの記事見たらいいんだなー という認識 --- ### 2/21 3章 p116~p121 - Action cable・・・websocketを利用した、リアルタイム通信を実現できる機能 - websocket・・・必要に応じてサーバーからクライアントに対して情報を送ってくれるシステムで、情報を得るためにクライアントがリクエストする必要がない web技術の基本P61の上の図 ①SYNの状態を保持する - systemテスト・・・E2Eのテストのこと E2E とは[Qiita](https://qiita.com/mt0m/items/7e18d8802843d9f60d28) ・ブラウザ上の挙動テスト(RSpecでいうカピバラさん動かすやつとか) ・ユーザと同じようにブラウザを操作し、挙動が期待通りになっているか確認 minitestでは行を指定してテストをできる。(RSpecでも出来んのかな🤔) --- ### 2/24 3章 p122~ `=~` [結合演算子](https://www.javadrive.jp/perl/regex/ini/index2.html) [Rubyのppとは](https://docs.ruby-lang.org/ja/latest/library/pp.html) --- ### 2/25 p134~ #### Rackとは - サーバーとRubyアプリケーションの間の緩衝材(https://blog.mothule.com/ruby/rails/rack/rails-rack-middleware-extension) #### ミドルウェアとは - OSとアプリケーションの中間で頑張るプログラムなんだな~(https://wa3.i-3-i.info/word178.html) > どこのコンビニ行ってもヤマザキパンが置いてある。(山奥でも離島でも)輸送も含めてヤマザキパンはミドルウェア なんじゃね?(←話半分で!!) #### Rackミドルウェア - Rackミドルウェアを使うときは`use`メソッドを使う - 検証ツールでネットワークのヘッダーの中に"X-Runtime"という部分が追加される(処理時間) ```ruby= #config.ru require "rack" require_relative "app" use Rack::Runtime run App.new ``` # 🤔 <ワカンネ #### 3-2-5 RailsとRackの関係 RailsもRackの仕様に則ったアプリである。 ↓Rails newしたら入ってるっぽくて見てみてたらホントだった(草) ![](https://i.imgur.com/1pslSZL.png) --- 普通に`rails s`するとSQLが走ってるし、何よりログが見やすい `$ bundle exec rackup`はSQLが見れない ![](https://i.imgur.com/S5iYT7U.png) `$ bundle exec rails s`は見やすい ![](https://i.imgur.com/stMgZxD.png) railsコマンドを打った時に見易くするために開発者はRackすなわち`bin/rails`の中に色々書いてくれてるんだと思う。。。 流石にgithubは見に行く勇気が無い ### 2/26 p139~p141 3-3前まで ### 2/28 p141~p144 3-3から [changeとupとdown](https://qiita.com/koni4k/items/294342048cb6d47bcc3f) [rollbackできないときどうしたらええねん](https://qiita.com/takuyanin/items/6d51ffb4078a417fed35) →rollbackできないとき、migrationファイル修正して再度rollbackするとできるよ(本当かな・・) [reversibleメソッド :Railsガイド](https://railsguides.jp/active_record_migrations.html#:~:text=%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84%E3%80%82-,3.10%20reversible%E3%82%92%E4%BD%BF%E3%81%86,-%E3%83%9E%E3%82%A4%E3%82%B0%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3) ```ruby= reversible do |dir| dir.up do # CHECK制約を追加 # ↓ 生のSQLを書くよ!の宣言 execute <<-SQL ALTER TABLE distributors ADD CONSTRAINT zipchk CHECK (char_length(zipcode) = 5) NO INHERIT; SQL    # ↑ 大文字SQLで囲むと「こっからここまでSQLの処理ですよ」って意味 end ``` https://stackoverflow.com/questions/2500436/how-does-cat-eof-work-in-bash#:~:text=This%20is%20called%20heredoc%20format%20to%20provide%20a%20string%20into%20stdin.%20See --- ### 3/1 p144~ #### 複数のDB - database。ymlに設定追加すると複数のDB扱えるようになる - モデルを複数のDBに接続したいときはestablish_connectionを使う(モデルに書く) ★なぜマルチDBを使うのか(https://tech.ga-tech.co.jp/entry/2019/06/rails-multi-db) プロジェクトの規模が大きくなって、複数データベースを対応する必要が発生することがあります。主に以下の2つのユースケースがあると思います。 ・新しいシステムで既存のDBも使いたい ・スピード改善またはデータ安全性を向上するため、読み取り専用のレプリカを使いたい - (プライマリーDB)書き込み用データベース - (レプリカDB)読み取り専用データベース ★高負荷分散のため[弥生開発ブログ](https://tech-blog.yayoi-kk.co.jp/entry/2020/10/09/110000) [Active Record で複数のデータベース利用:Railsガイド](https://railsguides.jp/active_record_multiple_databases.html) [ls6.0で複数のデータベースを利用する: Zenn](https://zenn.dev/youichiro/articles/8a1379e7693882d5f1a2) [ self.abstract_class = true の意味](https://codaholic.org/?p=2214) #### p149~ ★書き込み用と読み込み用に分けて負荷分散 ・書き込みされると自動でレプリケーション→読み込み用にコピーされる ・自動で書き込みか読み込みかでDB参照自動切り替え出来る(delayを設定しておくことで決まった秒数内に読み込みしちゃった場合は書き込みDB参照する) --- ### 3/5 p152~154 --- ### 3/7 p154~ #### ・秘密情報を管理する - Rails4.0まではsecrets.ymlで管理(secret_key_base)→ rails new時に作成される - Rails5.1ではsecret.yml.encというファイルに暗号化した内容を記載する。(rails newで作成されないので別途作成)本番環境ではRAILS_MASTER_KEYを使って複合キー渡す #### credentials - Rails5.2→rails newするとcredentials.ymlとsecret_key_baseが作成される。環境別に対応することができない - Rails6.0→rails newするとcredential.ymlとsecret_key_baseが作成される。環境別にも対応可。その場合はstaging用のymlとmaster_key_baseを作成する。別環境でも同じ環境のcredencialsを使うこともできる。その場合はconfig/environment以下の環境別ファイルにymlとkeyのpathを指定してあげる。 [credentialsの基本:Qiita](https://qiita.com/NaokiIshimura/items/2a179f2ab910992c4d39) master_keyとcredentialはセットなのでgit cloneした時にcredentialファイルは開けない。 master_keyはgitignoreされてる --- ### 3/7 p159~ - リバースプロキシ?・・・Webサーバさんの身代わりになってホームページのファイルを返してくれるサーバさんのこと。Webサーバーのパシリ。 - プロキシ?・・・Webサーバさんの身代わりになってホームページのファイルを返してくれるサーバさんのこと。ブラウザのパシリ。 - Early hints・・・アセット等を通常より早くダウンロードしようとする仕組み。場合によっては早くならなかったりサーバー・アプリの性質によっては問題がある場合もあるので十分検討してから導入すべし [preloard サイト高速化🤔](https://wk-partners.co.jp/homepage/blog/hpseisaku/htmlcss/preload/) [NIKKEIのブログ: Early Hints](https://hack.nikkei.com/blog/advent20201220/) --- ### 3/10(木) p164 #### CSP - コンテンツセキュリティポリシー XSSの脆弱性を軽減する働きがある。 [CSP reportを利用したときの違反報告の例](https://developer.mozilla.org/ja/docs/Web/HTTP/CSP#sample_violation_report) ↑いきなり本番環境に入れたらセキュリティに引っかかりまくってサイト見れなくなるかもなので事前にreportで検証できるやつ 設定でホワイトアウト的に許可していないと"blocked-uri"に載る? --- ### 3/11(金) p167~ [nonce :Railsガイド](https://railsguides.jp/security.html#:~:text=%E6%94%BB%E6%92%83%E3%81%AF%E3%80%81%E3%82%BB%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AB-,nonce,-%EF%BC%881%E5%9B%9E%E9%99%90%E3%82%8A) [uuid SecureRandom](https://docs.ruby-lang.org/ja/latest/method/SecureRandom/s/uuid.html) [SecureRandom base64](https://docs.ruby-lang.org/ja/latest/class/SecureRandom.html) [分かりそうで分からない base64](https://wa3.i-3-i.info/word11338.html) --- ### 3/15(火) p172~177 4章 --- ### 3/17(木) p177~ https://browserslist.dev/?q=ZGVmYXVsdHM%3D https://babeljs.io/ - nodeのバージョン→偶数がおすすめ。安定版を入れないとエラーのもととなる場合がある [LTS(LongTermSupport)版を使って!](https://www.publickey1.jp/blog/21/nodejsltsnodejs_16apple_m1javascriptv8_90.html) https://nodejs.org/ja/ [Node.jsとはなにか?なぜみんな使っているのか?](https://qiita.com/non_cal/items/a8fee0b7ad96e67713eb) - Nuxt・・・Vue.jsのフレームワーク - Next・・・Reactのフレームワーク [パラメータ](https://railsguides.jp/action_controller_overview.html#%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF) [params](https://github.com/rails/rails/blob/de53ba56cab69fb9707785a397a59ac4aaee9d6f/actionpack/lib/action_controller/metal/strong_parameters.rb#L1215) https://github1s.com/rails/rails/blob/de53ba56cab69fb9707785a397a59ac4aaee9d6f/actionpack/lib/action_controller/metal/strong_parameters.rb --- ### 3/18 p183~ - loader - cssや画像をJavaScriptに変換してくれるやつ --- ### 3/22 p188~ - SourceMapとは・・・コンパイル前後情報が入ったファイル。コンパイルされたファイルを使用してブラウザが表示しているがコンパイル前の情報が無いともとのファイルが特定できない→SourceMapを利用することでコンパイル前後の情報がわかるのでファイル特定ができるようになる。 SourceMapはWebpackに入ってるみたいです https://qiita.com/syunk38/items/a9b5363903dd1fd5dc44 https://chuckwebtips.hatenablog.com/entry/2016/03/02/000000 --- ### 3/24 p192~201 4-2-2 --- ### 3/25 p201~203 Pjax・・・ [Railsガイド: サーバー側で考慮すべき点](https://railsguides.jp/working_with_javascript_in_rails.html#:~:text=%E3%81%B9%E3%81%8D%E3%81%A7%E3%81%99%E3%80%82-,4%20%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E5%81%B4%E3%81%A7%E8%80%83%E6%85%AE%E3%81%99%E3%81%B9%E3%81%8D%E7%82%B9,-Ajax%E3%81%AF%E3%82%AF%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%88) --- [ジグザグ](https://www.zig-zag.co.jp/) https://youtu.be/Nv6igwCFBTo?t=7329 https://radicode.co.jp/ https://www.wantedly.com/companies/company_9848818 福利厚生 https://fu-ku-ri.com/interview/779 スライド https://speakerdeck.com/itandi/itandi-054b9273-cff7-48ad-9b19-eca0fc4147f1 https://school.runteq.jp/v2/curriculums ![](https://i.imgur.com/V9XGi5U.png)

    Import from clipboard

    Paste your markdown or webpage here...

    Advanced permission required

    Your current role can only read. Ask the system administrator to acquire write and comment permission.

    This team is disabled

    Sorry, this team is disabled. You can't edit this note.

    This note is locked

    Sorry, only owner can edit this note.

    Reach the limit

    Sorry, you've reached the max length this note can be.
    Please reduce the content or divide it to more notes, thank you!

    Import from Gist

    Import from Snippet

    or

    Export to Snippet

    Are you sure?

    Do you really want to delete this note?
    All users will lose their connection.

    Create a note from template

    Create a note from template

    Oops...
    This template has been removed or transferred.
    Upgrade
    All
    • All
    • Team
    No template.

    Create a template

    Upgrade

    Delete template

    Do you really want to delete this template?
    Turn this template into a regular note and keep its content, versions, and comments.

    This page need refresh

    You have an incompatible client version.
    Refresh to update.
    New version available!
    See releases notes here
    Refresh to enjoy new features.
    Your user state has changed.
    Refresh to load new user state.

    Sign in

    Forgot password

    or

    By clicking below, you agree to our terms of service.

    Sign in via Facebook Sign in via Twitter Sign in via GitHub Sign in via Dropbox Sign in with Wallet
    Wallet ( )
    Connect another wallet

    New to HackMD? Sign up

    Help

    • English
    • 中文
    • Français
    • Deutsch
    • 日本語
    • Español
    • Català
    • Ελληνικά
    • Português
    • italiano
    • Türkçe
    • Русский
    • Nederlands
    • hrvatski jezik
    • język polski
    • Українська
    • हिन्दी
    • svenska
    • Esperanto
    • dansk

    Documents

    Help & Tutorial

    How to use Book mode

    Slide Example

    API Docs

    Edit in VSCode

    Install browser extension

    Contacts

    Feedback

    Discord

    Send us email

    Resources

    Releases

    Pricing

    Blog

    Policy

    Terms

    Privacy

    Cheatsheet

    Syntax Example Reference
    # Header Header 基本排版
    - Unordered List
    • Unordered List
    1. Ordered List
    1. Ordered List
    - [ ] Todo List
    • Todo List
    > Blockquote
    Blockquote
    **Bold font** Bold font
    *Italics font* Italics font
    ~~Strikethrough~~ Strikethrough
    19^th^ 19th
    H~2~O H2O
    ++Inserted text++ Inserted text
    ==Marked text== Marked text
    [link text](https:// "title") Link
    ![image alt](https:// "title") Image
    `Code` Code 在筆記中貼入程式碼
    ```javascript
    var i = 0;
    ```
    var i = 0;
    :smile: :smile: Emoji list
    {%youtube youtube_id %} Externals
    $L^aT_eX$ LaTeX
    :::info
    This is a alert area.
    :::

    This is a alert area.

    Versions and GitHub Sync
    Get Full History Access

    • Edit version name
    • Delete

    revision author avatar     named on  

    More Less

    Note content is identical to the latest version.
    Compare
      Choose a version
      No search result
      Version not found
    Sign in to link this note to GitHub
    Learn more
    This note is not linked with GitHub
     

    Feedback

    Submission failed, please try again

    Thanks for your support.

    On a scale of 0-10, how likely is it that you would recommend HackMD to your friends, family or business associates?

    Please give us some advice and help us improve HackMD.

     

    Thanks for your feedback

    Remove version name

    Do you want to remove this version name and description?

    Transfer ownership

    Transfer to
      Warning: is a public team. If you transfer note to this team, everyone on the web can find and read this note.

        Link with GitHub

        Please authorize HackMD on GitHub
        • Please sign in to GitHub and install the HackMD app on your GitHub repo.
        • HackMD links with GitHub through a GitHub App. You can choose which repo to install our App.
        Learn more  Sign in to GitHub

        Push the note to GitHub Push to GitHub Pull a file from GitHub

          Authorize again
         

        Choose which file to push to

        Select repo
        Refresh Authorize more repos
        Select branch
        Select file
        Select branch
        Choose version(s) to push
        • Save a new version and push
        • Choose from existing versions
        Include title and tags
        Available push count

        Pull from GitHub

         
        File from GitHub
        File from HackMD

        GitHub Link Settings

        File linked

        Linked by
        File path
        Last synced branch
        Available push count

        Danger Zone

        Unlink
        You will no longer receive notification when GitHub file changes after unlink.

        Syncing

        Push failed

        Push successfully