fujjima’s blog

主に備忘録

railsチュートリアル2週目 学習メモ 1章〜3章

こんにちは、fujjimaです。

 

railsチュートリアルが一通り終わったんですが、正直5,6章あたりから読み飛ばすところが増えてきて、いまいち理解しきれていなかったので、1章から一つ一つ理解しながら復習を行うことにしました。そこで、疑問に思っていたところや詰まっていたところを、参考にさせて頂いたサイトと合わせて、備忘録としてまとめてみました。

※かなり雑にまとめているので、後々加筆修正が多分入ります。

 

 

1章

 

<railsインストール>

■bundle,Gem周り

・bundleとはなんぞや

・GemfileとGemfile.lockって何が違うのか

 

■pumaとは

 

参考:

pumaを使ってみた

 

■排他処理とは

 

参考:

» Ruby/Railsでロックファイルによる排他制御 TECHSCORE BLOG

 

webrickとは?

参考:

WEBrickを使ってみよう! | Think IT(シンクイット)

 

<controllerファイル>

■Action Controllerとは

railsにおける「MVC」の概念の内、"C"に相当するライブラリの一つ。

railsのコントローラは基本的にこのAction Controllerクラスを継承している。

 

参考:

Action Controller の概要 | Rails ガイド

ActionControllerとは - はてなキーワード

 

■Application Controllerとは

 

参考:

Railsで共通メソッドの作り方 - 線路は続くよどこまでも。

 

■コントローラとは

コントローラはユーザーからのリクエストを受け取り、モデルやビューなどと連携し結果をユーザーに返す役割をする部分。

 

参考:

コントローラとアクション - Ruby on Rails入門

 

■renderとは

テンプレート表示のためのメソッドであり、contoroller,view両方で使用することが出来る。(ただし、それぞれの場合で使用方法が若干異なる)

 

参考:

render - リファレンス - - Railsドキュメント

rails renderの基礎から使い方まで(partial, 引数) | 侍エンジニア塾ブログ | プログラミング入門者向け学習情報サイト

 

■routes.rbファイルとは

HTTPで送信されてきたリクエストを適切なコントローラのアクションに割り振る役割を持っている。5種類のアクションがある(get,post,delete,puch,post)

 

参考:

【完全入門】Ruby on Railsのroutesについてわかりやすく解説してみた! | 侍エンジニア塾ブログ | プログラミング入門者向け学習情報サイト

 

 

2章

 

 ■リソース

データモデルとwebインターフェイスが組み合わさったもの。

  • データモデルとは 現実世界のあるモノを分類/抽象化して落とし込んだカタマリ (より具体的にいえば(今回の文脈では)「RDBMSに則って設計されたデータ群」と同義)
  • webインターフェイスとは
    データモデルをwebで取り扱えるようにしたもの

→つまりリソースとは、

 HTTPプロトコル経由で自由にCURD(作成/読み出し/更新/削除)できる

(分類された)データ群

 

参考:

Railsを支える基本概念の整理(RESTfulやリソースなど)

 

■scaffold

  • モデル、コントローラ、ビュー、ルーティングなどをまとめて作成し、雛形を作成してくれる
  • 作成したモデルに対して、各カラムの名前及びデータ型(int型とかString型とか)を指定できる
  • 各種webページを自動で作ってくれる(対応アクションはindex,show,new,edit)

 

  • コマンドの書式は下記のような感じ
rails generate scaffold モデル名 カラム名1:データ型1 カラム名2:データ型 2 …

 

  • 自動的に作成されるコントローラファイルは下記のような感じ

※長いので一部省略してます

 

class UsersController < ApplicationController
  .
  def index
    .
  end

  def show
    .
  end

  def new
    .
  end

  def edit
    .
  end

  def create
    .
  end

  def update
    .
  end

  def destroy
    .
  end
end

 

※この時、モデル名はリソース名の単数形にする(例:リソース名=Users,モデル名=User)。これは、railsでは、モデルが設計図という概念である(=設計図から作られたものでなく、あくまで設計図そのもの)と前提に置いており、概念は複数形には出来ないためである。一方、リソース名は上記の通り自由にCRUDできるデータ群なので、複数形となる。

 

参考:

超便利!Ruby on Railsのscaffoldの使い方 | TechAcademyマガジン

Railsを支える基本概念の整理(RESTfulやリソースなど)

 

↓なぜモデル名が単数なのかについての参考

"rails generate scaffold modelname"でモデル名を単数にする理由について · Issue #94 · yochiyochirb/meetups · GitHub

 

■ resources

routes.rbファイルで使用され、自動でRESTFULなルート定義を設定する。

"rails routes"コマンドでHTTPメソッド(Verb列)とURLとアクションが紐づいたルート定義が生成されていることを確認出来る。

なお、HTTPメソッドはリソースに対して行われるものなので、対象のリソースを指定する。(resources :usersのように)

参考:

【Rails入門】resourcesの使い方まとめ | 侍エンジニア塾ブログ | プログラミング入門者向け学習情報サイト

Rails のルーティング | Rails ガイド

 

インスタンス変数(@が付く変数)

インスタンスごとに値を持つ変数。

 

参考:

変数の種類を知っておこう!Ruby変数のスコープの使い方 | TechAcademyマガジン

【Ruby入門】Rubyのインスタンス変数とクラス変数 | UX MILK

 

 

インスタンス、クラスの概要をざっくりと分かりやすく解説してくれています

クラスメソッドとインスタンスメソッド - mic_footprints

 

DIVE INTO CODE | クラスとインスタンスとは

 

■validates

バリデーションは、正しいデータのみをデータベースに保存するために行われる。

例えば下記のような部分がバリデーションである。

 

class Micropost < ApplicationRecord
    validates :content, length: {maximum: 140}
end

 

validatesで文字列の長さを検証する時の使い方は以下のようになる。

validates(検証するフィールド名, :length => 検証パラメータ)

 

今回で言うと、下記のようにvalidatesを使用していることが分かる。

検証するフィールド名 = :content(シンボル)

:length => 検証パラメータ = length: 検証パラメータ(ハッシュ構造のデータ型の代入)

 

※ここで、":content"と" maximum: " にそれぞれ付いてる" : "の位置の違いがとても気になったので、■ハッシュとシンボルに別枠としてまとめた。

 

参考:

Railsバリデーションまとめ

Active Record バリデーション | Rails ガイド

validates - リファレンス - - Railsドキュメント

 

 

■ハッシュとシンボル

【シンボル】

文字列に見えるが内部は数値。Symbolクラスのオブジェクトであり、同じ表記のシンボルなら、必ず同じオブジェクト※を指す。

本当にざっくり言うと、":content"のように文字列の前に":"が付いていたらシンボル。

ただし、代入の際は":"は文字列の後ろに来る。下のようなパターンはまさにそれ。

 

fruites = {apple: red, grape: purple} #ここで代入
puts fruites[:apple] #redと表示
puts fruites[:grape]  #purpleと表示

 

※ここで、「オブジェクトとは?」と思った人は下の「参考:」内にあるリンク先をみて下さい。

 

【ハッシュ】

キーと値を組み合わせて保持するデータ構造。配列が開始番号をゼロとした要素番号でしか要素の指定が出来ないのに対して、「○○なら××」というようにキーに対する値と言う形で値を管理できる。まぎらわしいが、下のようにシンボルを使ってハッシュを作ることも出来る。

user = {:user1 => "ユーザー1", :user2 => "ユーザー2"} #ここでシンボルに代入している
puts user #表示は右の通り {:user1=>"ユーザー1", :user2=>"ユーザー2"}

 

参考:

↓シンボル

配列とハッシュとシンボルは紛らわしいので整理!!

[Ruby] シンボルとハッシュ - mikanmarusanのブログ

 

↓ハッシュ

【Ruby入門】ハッシュ(hash)とシンボルの基本 | 「ポテパンスタイル」

 

↓シンボルの詳細な理解に関しては以下を参考にして下さい

Ruby on Rails 入門のための知識 1(シンボルとハッシュ) - OnsenとRuby

 

↓シンボルのちょっと難しいやつ

Railsでよく出てくるコロン(:)は、シンボルって言うやつらしい | JavaからのRuby on Rails入門

 

↓オブジェクトについて

rubyにおけるオブジェクト指向とはなにか(๑•̀ㅂ•́)و✧【基礎】

 

 ■has_many,belongs_toの関連付け

そもそも関連付けとは、テーブル同士に関係があることを示すためのもの。

belongs_toとhas_manyの二つがあるが、それぞれ下記のような使用法となる。

 

・belongs_to:

 参照元テーブルから参照先のテーブルのデータの情報にアクセスすることが出来る

 ようにする→参照元と参照先の関係を明示する

・has_many:

 1:n (nは任意の整数) の関係を表す。例えば一つのオブジェクトに対して、

 複数のオブジェクトが存在していることを明示できる。

※has_many関連付けを使用する場合、相手のモデル名は複数形にする必要がある

 

参考:

↓関連付けの基本 

【Rails入門】has_many、belongs_toの使い方まとめ | 侍エンジニア塾ブログ | プログラミング入門者向け学習情報サイト

【Rails初心者向け】モデル間の関連付け(アソシエーション)まとめ

 

 

■継承

rubyの継承では、「親クラス」のメソッド、カラムを使用することが出来るようになるため、コードの量を減らすことが出来る。

 

参考:

実際の業務で役立つ!Rubyでクラスを継承する方法 | TechAcademyマガジン

 

↓継承とかオーバーライドとか

Rubyの継承とオーバーライドについてまとめてみた | JavaからのRuby on Rails入門

 

 

ざっと2章はここまで!

 

 

3章

 

 ■README.md

 

参考:

 

 

■heroku,githubコマンド

 

ここだけは注意!!/////////////////////////////////////////////////////////////////////////////////

今後Herokuで何らかの本番アプリケーションを運用する予定があるなら、7.5のproduction用Webサーバーの設定に必ず従ってください。

////////////////////////////////////////////////////////////////////////////////////////////////////////////

参考:

 

↓herokuにデプロイしたアプリを消す時

【herokuコマンド】createからdestroyまで

 

 ■rails g controller 〜 コマンドについて

rails generateコマンドの一種である。ファイルの自動生成コマンドであり、"generate"部分を"g"に省略可能である。どういったファイルが生成されるのか、については「参考:」にあるリンク先のサイト様を参照して下さい。とてもきれいにまとまっています。

 

今回で言うと、"rails g controller〜"だと以下のファイルが生成されるそうです。

・コントローラ

・ビュー

・アセット(参考: にアセットについてのリンク先を載っけています)

・ルート

・テスト

・ヘルパー

 

ちなみに、下にコマンドの実行結果を載せました。

 

     create  app/controllers/static_pages_controller.rb
       route  get 'static_pages/help'
       route  get 'static_pages/home'
      invoke  erb
      create    app/views/static_pages
      create    app/views/static_pages/home.html.erb
      create    app/views/static_pages/help.html.erb
      invoke  test_unit
      create    test/controllers/static_pages_controller_test.rb
      invoke  helper
      create    app/helpers/static_pages_helper.rb
      invoke    test_unit
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/static_pages.coffee
      invoke    scss
      create      app/assets/stylesheets/static_pages.scss

 

参考:

いつも忘れる「Railsのgenerateコマンド」の備忘録 - maeharinの日記

 

 ↓アセット

Rails Assetの管理についてまとめる

 

マッピング(routes.rbファイル)

1章でも出てきたroutes.rbファイルについて、中身の詳細な書き方を調べました。

 

※ちなみに下記の①、②の書き方では同じ結果となった。

①get  'static_pages/home', to: 'static_pages#home'
②get  'static_pages/home'

 

参考:

Railsのroutesを読む

 

↓個人的に気になったアクションとビューの対応について

Railsのコントローラとアクションを作成する

 

 

■テスト

RSpecを使わない素のテストコードの書き方で、下の2種のテストを行う。

・unit test (モデルのテスト)

・functional test(コントローラ+ビューのテスト)

 

「■rails g controller 〜」で実行したコマンドで作成されたテストファイルが下記のようなもの

require 'test_helper'

class StaticPagesControllerTest < ActionDispatch::IntegrationTest
  test "should get home" do
    get static_pages_home_url
    assert_response :success
  end

  test "should get help" do
    get static_pages_help_url
    assert_response :success
  end

end

 

参考:

RSpec使わないテストの基本的な考え方

Ruby on Railsのテストの書き方 (モデルの単体テストと,コントローラの機能テスト) - 主に言語とシステム開発に関して

 

Railsのテスト | Rails日本語ドキュメント | Ruby STUDIO

 

●assert_select

2つの書式があり、セレクタで指定された要素が条件に一致する場合と、選択された全ての要素が条件に一致する場合である。

今回でいうと、about.html.erbファイル内の<title>タグ内に"About | Ruby on Rails Tutorial Sample App"と一致しなければテスト結果で「Red」となる。

 

※下のコードは"static_pages_controller_test.rb"内のAboutアクションに関するテスト部分である

test "should get about" do
    get static_pages_about_url
    asse_response :success
    assert_select "title", "About | Ruby on Rails Tutorial Sample App"
  end

 

ちなみに<title>は、ブラウザのツールバーの表示されるタイトルのことである。

参考:

↓公式リファレンス

Rails テスティングガイド | Rails ガイド

 

↓assert_selectの基本的な使い方(分かりやすい!)

assert_selectの使い方 - ザリガニが見ていた...。

 

■埋め込みRuby

●provide及びyeildについて

provide関数(<% provide(:title, 'Home') %>)を使ってViewからLayoutにデータを引き渡すことが出来る。今回は一つのhtmlファイル内で呼び出しているが、これも同様の使い方だろうか。

yieldに関しては、「レイアウトを使う際に、/static_pages/homeにアクセスするとhome.html.erbの内容がHTMLに変換され、<%= yield %>の位置に挿入される、ということだけ理解しておけば問題ありません。」との記載。

 

●application.html.erbについて

上で疑問に思って点が説明されていた。背景としては、「home,help,aboutの3つのファイルがあるけど、ページの内容とかタイトルとかほぼ一緒だよね?まとめようぜ」という感じ。

application.html.erbファイルに共通するコード部分を書いておいて、各ファイルで異なる部分に関しては"yield"を使って引数を与えてみたり、個別のhtmlファイルを引っ張ってきたりする感じかな。

参考:

Railsでビューのレイアウトを指定する - Rails Webook

provide関数とyield

yieldについて

 

■(発展)minitest reportersについて

テスト結果をプログレスバーで表示してくれる。gemでインストールして使用する。使用方法に関しては「参考:」のリンク先を参照のこと。

 

参考:

GitHub - kern/minitest-reporters: Create customizable MiniTest output formats.

minitestのオススメ基本設定調べてみた