Ruby on Railsメモ


# ruby on railsの仕組み
- URLをたたく
- ruby on rails内のルーティング機能がルーティングテーブルを参照し、コントローラとアクションを取得する。
- コントローラとアクションがコントローラ機能に渡され、コントローラ機能が、対応するHTMLファイルを検索する。
  - コントローラがモデルを経由してデータベースからデータを操作（取得・挿入・削除など）
- ビュー機能がブラウザにHTMLファイルを返す。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281030/5ac67c2d-f09d-ee0c-b19d-3a20c41b914e.png)


# フォルダ構成例
- app
  - assets：資産
    - config：
    - stylesheets：スタイルシート可能場所
      - home_scss
  - controllers：コントローラ格納場所
    - home_controller.rb
  - views：HTMLファイル格納場所
    - home
      - top.html.erb
    - layouts：共通のHTMLを書いておく場所（例：トップページのリンクなど）
      - application.html.erb
  - models
    - テーブルを操作するためのモデルと呼ばれる特殊なクラスのファイル
    - 例：空白の入力をNGとする。
- bin
- config
  - routes.rb：ルーター
- public：共通
  - top.jpg
- db
  - migrate：マイグレーション
    - マイグレーションファイル：データベースへの変更内容が定義される


# コマンド
## 基本
- rails new アプリ名：Railsアプリの作成
- rails server：サーバーの起動
- rails g(generate) controller aaaa bbb
  - aaaaコントローラのbbbアクションを作成
- rails console：コンソールを起動。Rubyを手軽に実行できる。

## DB
- テーブルの作成
  - rails g model xxxx yyyy:zzzz (yyyy:zzzz)：テーブルの作成。カラムとデータ型は複数指定可
    - xxxx:テーブル名、yyyy:カラム名、zzzz：データ型
    - ファイルの作成をしてから反映するまでの間はブラウザのページがエラーになる
  - rails db:migrate：データベースに変更を反映
  - rails g migration xxxxx：マイグレーションファイルのみ作成
    - 例： rails g migration add_image_name_to_user
- テーブル操作
  - コントロールファイルでの操作
    - xxxx = yyyy.new(zzzz:aaaa) ：　レコードの追加
      - 例：post = Post.new(content:"追加します")
      - xxxx：変数名、yyyy：テーブル名、zzzz：カラム名、aaaa：追加内容
    - xxxx = yyyy.find_by(zzzz:id) ：idから特定のレコードを1件取得
      - 例：post = Post.find_by(id: 2)
      - xxxx：変数名、zzzz：id名
    - xxxx = yyyy.where(zzzz:id) ：idから特定のレコードを全て取得
      - 例：post = Post.where(id: 2)
      - xxxx：変数名、zzzz：id名
    - xxxx.destroy：レコードの削除、find_byなどで取得したあとに行える
      - xxxx：変数名
  - マイグレーションファイルでの操作
    - add_column テーブル名, カラム名, データ型
      - カラム追加
      - 例：add_column :users, :image_name, :string
    - remove_column テーブル名, カラム名, データ型
      - カラム削除
      - 例：remove_column :users, :image_name, :string


- rails g model：モデルを作成する。
  - モデル：データベースとのやりとりを行う。
- xxxx.save：DBの内容の更新を保存
- xxxx.first：DBの１レコード取り出す
- xxxx.all：DBのすべてのレコードを取り出す
- xxxx.yyyy：xxxx.firstなどで取得した列の値を出力する
  - xxxx：インスタンス名、yyyy：列名


# 変数定義
- コントローラ機能で変数定義するのが一般的。HTMLでも変数定義は可能。
  - コントローラ： @xxx = xxxx
  - HTML： <% xxxx = xxxx %>
- 通常の変数
  - 変数定義： xxx = yyy
    - price = 100
  - session：特殊変数。セッション情報を保持するときに使う


# routingテーブル
- get
  - データベースを変更しないときに使う
- post
  - データベースを変更する場合に使う
  - データベースは変更しないがセッション(session)の値を変更する場合に使う

# テーブルの連携
- テーブル作成時
  - migrationファイル作成時に結合キーにforeign_key: trueを指定する。
    - 例：`t.references :agency,       foreign_key: true`
- テーブル作成後
  - app/models配下でhas_many、belongs_toでテーブル間の連結を指定する。
    - 親側のファイルにbelongs_toを指定する。
    - 子側のファイルにhas_manyを指定する。

# その他
- <%= link_to "テキスト", "リンク先のパス", {method: xxx} %>：aタグを簡単に書いたもの
  - ex. <%= link_to "Yahoo!", "https://www.yahoo.co.jp/" {method: "post"} %>
  - xxxはgetやpostなどを指定する。デフォルトはget
- <%= form_tag("/xxx/xxx", {multipart: true}) do % >：フォームで入力したものを飛ばす先、画像を飛ばすなら、「{multipart: true}」を指定する。
    ＜textarea name="content"></textarea>
    ＜input type="submit" value="投稿">
  <% end %>
- redirect_to("/xxxx/xxx")：パスを指定する。別ページにとぶ
- render("/xxx/xxx")：ビューファイルを指定する（パスでない）。renderを記述した処理の中の変数がビューでも使える。
- <% xxxxx.errors.full_messages.each do |message| %>：エラーメッセージの出力
- name属性：parameterに対してデータとしての名前をつけることができるHTML属性。これによって、ユーザーがリクエストをする際に、viewの方で入力されたparameterにnameのキーをつけることができる。name属性をつけるときは、保存したいデータベースのカラム名にすること。
- 各コントローラの全アクションで共通する処理がある場合には、before_actionを使うと便利。xxx,yyyは使用できるメソッドを指定。すべてのメソッドで利用するなら記述不要。
  - 例  before_action :set_current_user, {only: [:xxx, :yyy]}
  - def set_current_user xxxxxx end