Ruby on Rails 絶対に参考にしてはいけないプログラミング ガチ超初心者の勉強まとめ

★コメントアウトについて

・パーセントのカッコ区切り<%=　%>のなかで、#～と記述すると以降が一行コメント化される
・rbファイルは#△コメント内容(△はインデント1つの意味)
・rbファイルの複数行コメント化

      =begin

      =end
で囲まれた部分はコメントアウトされる。

・erbファイルは<!--コメント化される内容-->となる。htmlと同じ

★インデントは半角幅2つ、読みやすいが未だに良くわからない

・ATOM設定で大変参考になりました
http://dormouse666.hatenablog.com/entry/2016/03/28/005857
http://tech.machiiro.jp/entry/2016/10/31/104815


★rails　重要な3大機能　MVCモデル

・Model[モデル]：データ操作

Controllerの指令をもとにデータ操作を実行(ロジックを記述)
Rubyで書かれた制御文を
SQLに翻訳しデータベースに命令出す

・View「ビュー」：画面の生成

Controllerから渡された情報をもとにHTMLを生成する。
Modelのロジックをもとに表示、画面を表示する

・Controller「コントローラー」：プログラム制御
データの操作、指令　中心の役割
(Viewの入力受け取り、Modelを起動)

→値をViewへ渡す


～MVC全体の概要～

①Router→Controller
RouterはURLとHTTPメソッドをもとに
どのコントローラアクションを
実行するか選択する

②Controller→Model
Controllerから受けた命令、
ModelがSQLに翻訳

③Model→データベース
Modelはデータベースに
データ操作の命令を出す

④データベース→Model
Modelからの命令を受け
結果をRubyに翻訳し直し返却

⑤Model→Controller
Modelは得た結果をControllerへ返却

⑥Controller→View
Contrlollerは得られた結果をViewへ渡す

⑦View→Controller
Viewは得た結果をもとにHTMLを生成、
Controllerに返す

→ControllerがレスポンスHTMLを返して
処理完了

※機能を作ってく順序としては

     1.必要な機能について要件をまとめる(要件定義)

     2.rails newコマンドで土台作り  「rails new アプリケーション名」でテンプレディレクトリが出来上がる
      →オプションコマンドがいろいろある、覚えられない

     3.ルーティング設定  /config/routes.rbファイルを編集

     4.rails g コマンドでMVC生成　「rails g controller rails g model scafold」はMVCまとめて作る

     5.コントローラ、モデル、ビューの順番で作成


★主要なHTTPメソッド(ブログの4大機能)　CRUD クラッド

Create　新規作成
Read　表示する
Update　更新
Destroy　削除

★eachメソッド
配列や範囲オブジェクトなどで用意されているメソッドであり、オブジェクトに
含まれている要素を順番に取り出してくれる。繰り返し処理のRuby版。

★データ型
・integerは数字のみ入れられる
・stringは文字列のみ入れられる
→分かってないからもう一度調べる

★controllerとviewの関係

～コントローラーでビューに反映させる情報を決めてる～

#コントローラー直下のホニャララcontroller.rb

def index
  @poems = Poem.all   #Poemデータを取得、変数poemsに入れる

#ビュー直下のホニャララindex

<% @poems.each do |poem| %>   #縦線で区切られた色poemはpoemsをpoemとしますよーの意味らしい
<td><%= poem.content %></td>
<td><%= poem.auther %></td>

----------------------------
～Railsターミナル画面のコマンド～

★新しいプロジェクト(アプリケーションの土台を作成する)を作成
(workspaceを作ってその配下で実行)

     rails new プロジェクト名 -d postgresql

★railsサーバを起動する

     rails s -b 0.0.0.0

http://localhost:3000/　　※ポート番号を3000に指定した場合

★開発環境_新規登録の認証メール　　letter_opener_webというgemを利用するパターン

http://localhost:3000/letter_opener

★gemファイルのインストール

    bundle install

bundleで削除

    bundle exec gem uninstall gemname


★リダイレクト先の確認コマンド

    rake routes

★マイグレーションファイルの実行コマンド(マイグレーションファイルを読み込む)

    rake db:migrate

★バージョン違いのrake aborted!エラー発生時のマイグレーション実行

    bundle exec rake db:migrate

→マイグレーションファイルは指示書の役割
これをもとにデータベースに反映している

補足：更新したテーブルが保管される場所(テーブルの状態を表している)
db/migrate/schema.rb

★テーブルの全削除(本番環境でやってはいけない)

    rake db:reset

★databaseを一度削除してもう一度作成し、db:migrate実行(本番環境でやってはいけない)
データベースをリセットして、マイグレーションを実行

    rake db:migrate:reset

★作成したuserテーブルを作成前の状態に戻す

    rake db:rollback

★シードデータの実行コマンド(ダミーのユーザデータを作成する)
gem 'faker'
bundle install

    rake db:seed

# 補足：db/seeds.rbに記述、10人分の架空の登録者を追加	
10.times do |n| # 10人分の架空のアカウントデータ投入
  email = Faker::Internet.email
  password = "password"
  user = User.create!(email: email,
    password: password,
    password_confirmation: password,
    uid: "1234567#{n}",
    provider: "",
  )
  5.times do |n| # 5件分まとめて投稿
    Photo.create!(
      img: (open("#{Rails.root}/app/assets/images/image.png")),
      content: "test",
      user_id: user.id,
    )
  　end
end

-----------

★生成コマンド

    rails　generate（rails　g）

★各種ファイル生成（MVCモデル）Model,View,Controller

    rails　g　scaffold

    使用例.)
    rails g model blog title:string content:text

    →マイグレーションファイルにtitleとcontentを追加している流れ

scaffoldはコントローラとアクション、その他の必要なモデルや
マイグレーションファイル、ビューファイル一式を作成してくれるっぽい

★mailer生成
rails g mailer "Mailer名"
Ex.)rails g mailer NoticeMailer sendmail_blog
→Mailer 「notice_mailer」を作成し、その中にsendmail_blogを定義する。

-----------

★ブレークポイントを仕掛ける(処理を停止させるコード内の記述）
binding.pry（Rubyメソッド）

例.)

    class BlogsController < ApplicationController
      def index
        @hoges = Hoge.all
          binding.pry  <!--サーバを立ち上げここでindexアクションにアクセスすると処理が止まる--> 
      end

Viewとかで使う(.rbとか.erbファイルで使う)ときは 
<% binding.pry %>

※ただし、gemファイル「pry-rails」をインストールしないと使えない


■binding.pryの実行例


      class BlogsController < ApplicationController
        def index
        end

        binding.pry 

        def new
          @blog = Blog.new
        end

        def create
        end
       end

新規投稿ボタンを押したら処理が止まる、リクエストをコンソールで
変数の中にあるものを確認することができる

        [1] pry(#<BlogsController>)> @blogs
          => nil

変数@blogsの中身に何が入ってるか
@blogsでエンターで中身が見られる
nilは実体なし　何もないの意味、変数の受け渡しに失敗しているっぽいことがわかる

        [2] pry(#<BlogsController>)> Blog.all
        Blog Load (57.2ms)  SELECT "blogs".* FROM "blogs"
        => [#<Blog:0x007f38d70a0368
        id: 1,
        title: "aaaaaaa",
        content: "aaaaaa",
        created_at: Sat, 16 Dec 2017 06:46:00 UTC +00:00,
        updated_at: Sat, 16 Dec 2017 06:46:00 UTC +00:00,
        user_id: 1>,
       #<Blog:0x007f38d70a0188
       id: 2,
       title: "ああああああ",
       content: "あああああああああ",
       created_at: Wed, 03 Jan 2018 05:35:54 UTC +00:00,
       updated_at: Wed, 03 Jan 2018 05:35:54 UTC +00:00,
       user_id: 5>,

データが取得できているか確認
Blog.allを実行したらデータが取得できてることが分かった

-----------



★シャットダウン(仮想環境終了、本番で絶対に使わない)

    shutdown -h


★コンソールでサーバ起動　consoleコマンド
ターミナル画面でRailsアプリケーションとやり取りすることができる

    rails　c

~consoleコマンド集~
入力して実行すると実行結果が反映される

・「モデル名.メソッド」

使用例.)

    Blog.all　ブログ全部表示
    User.count　ユーザ数カウント
    Blog.delete.all　投稿されたブログ全削除
    User.delete.all  会員全員削除

■データベース接続、データベースに対して直接確認

    rails dbconsole or rails db

--------------------------------------------------------------
■bootstrapでデザインしたいとき

主なグリッドシステム用のクラス3つ

* container　（コンテナ）異なる画面幅にあわせてレイアウトを切り替えする
* row　　　　（ロー）コンテナを水平に分割、上から下まで並列に区分けされる
* col　　　　（カラム）列を表す。エクセルのセルのイメージな気がする

view layouts内の
トップページのデザインを決めているファイルでだいたいやる

使用例.)
app\views\layouts\application.html.erb

    <div class="function-images">
      <div class="col-md-3 col-sm-6"> # カラムサイズ調整
        <div class="function-image"> # 表示させたいイメージ画像を設定
         <img src="<%= asset_path "hoge.png" %>"> # 画面表示


・いい感じにしてくれた設定

        <div class="wrapper col-md-4 col-md-offset-4 col-sm-10">

各html内のヘッダーに追記したらいい感じになってた

---------------------------------------------------------------
■ログイン機能実装したいとき
①devise初期設定、gemfileに追記

    gem 'devise'

②ターミナルコマンドの実行、初期設定のファイル生成

    rails generate devise:install

③devise用モデル、マイグレーションファイル生成

    rails generate devise user


④マイグレーション実行

    rake db:migrate


初回
テーブル作成まとめて

    rake db:create db:migrate

----------------------------------------------------------------
～GitHub実行コマンド～
GitHubのURL：　https://github.com/


■GitHubからローカルへクローン(複製)を持ってくる

    git clone "GitHubでコピペしたSSH protcolURLを貼り付け"

■Git初期化(最初の一回のみ実行)

    git init

■ソースコードをリポジトリに保存(-Aで全フォルダを指定、削除したファイルも含める)

    git add -A

■保存を実行

    git commit -m "どのような作業を行ったか作業名を書く"

■保存を実行した履歴の確認

    git log

■ソースコードをGitHubへ送信

    git push [コピーしたsshプロトコルURL]

■GitHubの管理下から除外する
.gitignoreに対象のファイルを記述することで、
gitの管理下から外す事が可能

---------------------------------------------------------------

■～はじめてのHEROKU～　 アセットプリコンパイル
(※初回のHerokuデプロイ前、CSS更新時に必ず実行)

1.config/environments/production.rbファイル

    コード内：config.assets.compile = false → trueに変更

2.ターミナル画面

     rake assets:precompile RAILS_ENV=production 実行

     git commit -m "コミット内容"（コミット内容はfirst_commitとか回数、改修した内容を書くのが良いっぽい）


■HEROKUコマンド　デプロイ（インターネッツを通じてWEBアプリを使えるようにする）

    1.    git add -A　                                   # 全部追加

    2.    git commit -m “コミットの内容”　                 # ”内容”が把握できやすいやつで命名

    3.    rake assets:precompile RAILS_ENV=production　  # アセットプリコンパイル

          →  デプロイ前にapp/asssetディレクトリ以下のファイルを編集したら
             アセットプリコンパイルを実行しないとコンパイルエラーが発生する
※3.でうまくいかないとき
    heroku git:remote -a　「heroku createして作ったpersonal apps名」


    4.    git push heroku master                         # commitしたファイルをHEROKUへPush

          git push origin master                         # AWSとかで構築したサーバへPush



    5.    heroku run rake db:migrate RAILS_ENV=production　# HEROKUのマイグレーション実行
 
          →2回目以降「heroku rake db:migrate」でおｋなのかな？

           heroku run rake db:migrate
           heroku run rake db:migrate:reset              # リセットしてマイグレーションが必要そうなときに
           heroku restart


■コミットしたファイルをHEROKUに送付するコマンド

    git push heroku master

■HEROKU上でrailsコンソールコマンドを実行する

    heroku run rails c



#用語集とエラー?

★before_actionメソッド
コントローラでの共通処理について

複数のアクションで共通している処理`はメソッドにまとめることができる

 編集、更新、削除の機能を共通でまとめたコントローラの例

    class BlogsController < ApplicationController

      before_action :set_blog, only: [:edit, :update, :destroy]

# privateの中の定義のなぞ

def set_blog # set_blogの箇所は名前が異なるとNomethodErrorとなったパターン

  @blog = Blog.find(params[:id])


★アソシエーション
あるモデルと別のモデルを関連付けさせること。
あるテーブルのデータに紐づく
別のテーブルのデータを得られるような
アプリケーションを作成するときに使う。よくわからない

例.)とあるユーザが書いたブログを不特定多数が見られるような仕組みを作るとき

※従来では、テーブル間のレコード結合をDBMS(データベース管理システム)に対して
SQL文でテーブル結合を実行してきたらしい。

・2つのモデル
hoge.rbとfuga.rbを結びつけるアソシエーションの例

belongs_to :hoge
has_many :fuga

hogeテーブルとfugaテーブルレコードが結びつく

・アソシエーション3種類
1. AモデルとBモデルが1対1で結びついている
2. AモデルとBモデルが1対多数で結びついている
3. AモデルとBモデルが多対多で結びついている


★バリデーション

これを追加しないと不正な値でも正しく処理されてしまう
そのためバリデーション機能を追加する。

    validates :カラム名（titleとかcontent）, presence: true

★jQuery(ジェークエリ)
$ドルマークから始まる箇所。
    こういうやつ
    jQuery ->
      $("a[rel~=popover], .has-popover").popover()
      $("a[rel~=tooltip], .has-tooltip").tooltip()

JavaScriptを簡単に使えるようにするライブラリのこと。

jQueryで何ができるのか？

例えば、

    クリックしたら画像が入れ替わる
    マウスオーバーしたあたりがアニメーションのように動く
    入力した中の文字とかを動的に(更新ボタン押さなくても)変更される
    スクロール量によって黒文字が赤文字になったり 等
Webサイトに動きをつける


★CoffeeScript(コーヒースクリプト)
JavaScript「JS」の拡張言語。
JSよりもコード文が短く、実行時にJSに変換され出力される。
rubyではCoffeeScriptを使う



★エラー画面の設定

config/environments/development.rb

config.consider_all_requests_local = true
→エラー出る、falseで作成したエラー画面表示


★API
Application Programming Interface
アプリケーションを連携できるようにさせたり
別のアプリ上の情報を取得することができたりする
外部からアプリケーションの機能を追加させること
ただし内部のコードまでは公開できない

～APIの流れ～　MVCモデルと異なる
ControllerはModelからデータを受け取った後、
Viewを経由せずそのままデータを返却

Model
→
Contrloller
→
Router


TwitterAPI設定のURL
https://apps.twitter.com/


★JSON(JavaScript Object Notation)
APIは性質上、データのみのやり取りを行っている
そのフォーマットとしてJSON形式が使用される
JSONはデータのみを表現するため	とても軽量らしい

★アセットパイプライン
複数のディレクトリやファイルに分かれた
assetsディレクトリ内のファイルを
1つに連結、圧縮する機能

★オーバライド(継承？)
オーバーライドとは、スーパークラスで定義されたメソッドをサブクラス側で同じ名前を
使ってメソッドを新しく定義しなおすこと

---

★インスタンスとは
オブジェクト指向でよく出る
クラス(設計図)を具現化した(実体)を指している

常に変数に何が入っているのかを念頭に組む
それができないとよくエラーになって挫折する、疲れる

・インスタンス変数：
@変数名で表す
例：
@blog

blogsコントローラに変数を定義してViewファイルにデータを渡すながれ


    app\controllers\blogs_controller.rb

    class BlogsController < ApplicationController
      def index
      end

      def new
       @blog = Blog.new
      end

      def create
      end
    end


-----

■GitHubからcloneしたソースコードを動かす方法

・gem install bundlerを実行
・bundle install を実行
・rake db:migrateを実行
・rails sを実行