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としますよーの意味らしい

<%= poem.content %>
<%= poem.auther %>

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

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

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

★railsサーバを起動する

 rails s -b 0.0.0.0

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

★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」でおkなのかな?

       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を実行