railsチュートリアル2週目 学習メモ 1章〜3章
こんにちは、fujjimaです。
railsチュートリアルが一通り終わったんですが、正直5,6章あたりから読み飛ばすところが増えてきて、いまいち理解しきれていなかったので、1章から一つ一つ理解しながら復習を行うことにしました。そこで、疑問に思っていたところや詰まっていたところを、参考にさせて頂いたサイトと合わせて、備忘録としてまとめてみました。
※かなり雑にまとめているので、後々加筆修正が多分入ります。
1章
<railsインストール>
■bundle,Gem周り
・bundleとはなんぞや
・GemfileとGemfile.lockって何が違うのか
■pumaとは
参考:
■排他処理とは
参考:
» Ruby/Railsでロックファイルによる排他制御 TECHSCORE BLOG
■webrickとは?
参考:
WEBrickを使ってみよう! | Think IT(シンクイット)
<controllerファイル>
■Action Controllerとは
railsにおける「MVC」の概念の内、"C"に相当するライブラリの一つ。
railsのコントローラは基本的にこのAction Controllerクラスを継承している。
参考:
Action Controller の概要 | Rails ガイド
■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の使い方まとめ | 侍エンジニア塾ブログ | プログラミング入門者向け学習情報サイト
■インスタンス変数(@が付く変数)
インスタンスごとに値を持つ変数。
参考:
変数の種類を知っておこう!Ruby変数のスコープの使い方 | TechAcademyマガジン
【Ruby入門】Rubyのインスタンス変数とクラス変数 | UX MILK
↓インスタンス、クラスの概要をざっくりと分かりやすく解説してくれています
クラスメソッドとインスタンスメソッド - mic_footprints
■validates
バリデーションは、正しいデータのみをデータベースに保存するために行われる。
例えば下記のような部分がバリデーションである。
class Micropost < ApplicationRecord validates :content, length: {maximum: 140} end
validatesで文字列の長さを検証する時の使い方は以下のようになる。
validates(検証するフィールド名, :length => 検証パラメータ)
今回で言うと、下記のようにvalidatesを使用していることが分かる。
検証するフィールド名 = :content(シンボル)
:length => 検証パラメータ = length: 検証パラメータ(ハッシュ構造のデータ型の代入)
※ここで、":content"と" maximum: " にそれぞれ付いてる" : "の位置の違いがとても気になったので、■ハッシュとシンボルに別枠としてまとめた。
参考:
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にデプロイしたアプリを消す時
■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の日記
↓アセット
■マッピング(routes.rbファイル)
1章でも出てきたroutes.rbファイルについて、中身の詳細な書き方を調べました。
※ちなみに下記の①、②の書き方では同じ結果となった。
①get 'static_pages/home', to: 'static_pages#home' ②get 'static_pages/home'
参考:
↓個人的に気になったアクションとビューの対応について
■テスト
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>は、ブラウザのツールバーの表示されるタイトルのことである。
参考:
↓公式リファレンス
↓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
■(発展)minitest reportersについて
テスト結果をプログレスバーで表示してくれる。gemでインストールして使用する。使用方法に関しては「参考:」のリンク先を参照のこと。
参考:
GitHub - kern/minitest-reporters: Create customizable MiniTest output formats.