改訂3版基礎Ruby on Railsを読んでみる
現状:
当方が4月からエンジニアとしてIT企業に入社するにあたり課題としてrailsでサービスを作っている。
目的:
サービスを作るにあたって不明点があまりにも多すぎた。
入社に向けて知識量を増やしたい。
遅すぎるがサービスの向上のための学習。
課題感:
成長を見据え、知識不足を補うために定期的に専門書を読み、形として残す。
私自身の振り返りはもちろんのこと、私同様初めてプログラミングをやってみたという方々の共感材料になればと思う。
概要
ruby on rails tutorialでは得られなかった初見を中心にメモっていく
Ruby on Railsの概要
-
Rubyはクラス設計、オブジェクトの実装拡張ができる
-
ルーティングはurlのパスとコントロールを結びつける役割
-
変数名を大文字から始めると定数になる
-
Rubyの変数の種類:
ローカル変数、グローバル変数、インスタンス変数、クラス変数 -
ソースコードに直接書かれた数値や文字列をリテラルという=>オブジェクト
-
gets
はターミナルから入力された文字列を返すメソッド
-chomp
は文字列の末尾から改行文字を取り除くメソッド -
#{〇〇}
というのは〇〇を文字列に変換した結果がうめこまれる
条件分岐
- 条件文:
Case 変数
When 式1... - おみくじとかもできる,
case
は===
3つ - if文は1行でかけるその場合は末尾に
then
を置く
後置の条件文という -
elsif
の綴りミスに気を付ける - if文はテンプレートにも使える
メソッドって??
- メソッドは機能の呼び出しのことを言う
- メソッドとはコードの塊に名前をつけたもの
- 引数はメソッドに指定する数値や文字列
-
Puts
,print
メソッドはターミナルに表示するメソッド
→ デバッグで使うことができる - メソッドは用意されたものだけでなく自分で作ったものも使える
- メソッドを抜ける場合は
return
を使えば抜けられる - メソッドを呼び出すときにブロックといわれるコードの塊を渡すことができる
- 読み出しや書き込み用のメソッドをアクセサメソッドという
- レシーバとは
.
の左側 - =つきのメソッドを呼ぶときはレシーバが必要
ブロックと繰り返し
- ブロックは
do
からend
までのかたまり - fileクラスのopenメソッドもブロックを呼び出せる
- ファイル内にそれを実行してくれる
yield
後に数値や文字列を指定するとそれがブロックパラメータの中身になる -
begin~rescue~end
で例外処理ができる
例外処理
例外が発生する可能性のあるプログラム、のちに処理するプログラム、しなかった場合のプログラム
- メソッドの場合はbeginなしで
rescue
,else
で例外処理ができる
配列と演算子
- rubyは数値と文字列は相互変換行われない
-
%w()
を使うと配列を簡潔にできる -
inspect
メソッドは配列を読みやすい文字列に変換してくれる
put arr.inspect == p arr
- 演算子には優先順位がある
- 算子の直後に改行しても文は続いているとみなされる
!=
...等しくないという比較演算子
!()
...ではない - 文字列を整数に変換数メゾッド:
to_i/(put= gets.to_i)
リンクの使い方
- リンクを用いたタグの生成
link_to “会員一覧”, :members
link_to “home”, root_path, class:”menu”
rubyのオブジェクトあれこれ
- シンボルとは文字列を整数で表したもの
"name"
が文字列:name
がシンボル -
detect
==find
メソッド - ハッシュ(連想配列)もオブジェクトの集まりを扱うオブジェクト、配列との違いは値に関する動作を番号の代わりにキー(名前)を使うこと
-
range1..10
範囲を示す -
range1...10
最後の要素を含めない - オブジェクト内のデータにアクセスするにはメソッドを書かなくてはならない
- nil,true,falesもオブジェクト
rubyのクラス
- クラスに似たものをモジュールという
- クラスにモジュールを取り込むことをミックスインという
railsのリクエスト、ルーティング
- HTTPはブラウザとサーバーがhtmlや画像などの情報をやり取りするときに使われるプロトコル
- getはリソースの要求
- postはリソースの送信
- ルーティングの設定に放ちパスをブラウザで開こうとするとエラーが起きる
-
no route matches
エラーの理由{ - ルーティングミス
- httpメソッドが合わない、postしか受け付けないアクションでgetしようとしたとき
- 存在しないファイルにアクセスしようとしたとき
} -
root
"コントローラー名#アクション名"でトップページを指定 - パラメータを,パスの中に埋め込みたいときは
:+パラメータ名
& コントローラーの中にparams[:id]
を入れる必要ある - searchアクション(routes.rbをいかに変更)
resources :book do collection{get"search"} end
時間表示
-
ragexp
クラス - timeクラスオブジェクトを使うにはクラスメゾットnowを使う
time= Time.now
puts time.strftime("%y/%m/%d %h:%m")
strftime
メソッド
ファイルの読み込み
- 別ファイルに書かれたプログラムをソース上に取り込むには
require
メソッドをる使う - 基本ファイルであれば何でも取り込める
- active supportは時間の扱いを簡単にしてくれる
インスタンスメソッド
- オブジェクトの設計をクラス、設計図に基づいて実際につくられたオブジェクトをインスタンスという
- インスタンスごとにデータを持たせるにはインスタンス変数を持たせる
- メソッドの呼び出しは制限がかけられ、どこからでも呼び出せるのはpablic、同じクラスやサブクラスのメソッド内だけで呼び出せるのがprivateメソッド
コントローラーの基本
- コントローラはモデルからデータを受け取りビューにレンダリングを行わせる
- 命名規約がある
-
application_comtroller
は全てに共通
get “lesson/:action(/:name)”=>”lesson”
- IPアドレスは取り出せる
- リダイレクションを行うとき同時にフラッシュが、よく使われる
- アクションコールバック
- アクションが実行される前後には、決まりきった処理を行うことがよくあり、アクションコールバックを行うとそうした処理を一つのメソッドにまとめて記述できる
・befor_action
・after_action
・around_action
の3つがある
テンプレの基本
- railsはアクション用のテンプレや部分テンプレをレンダリングしたのちにレイアウトテンプレをレンダリングする
- applicaitioncontrollerにlayoutメソッドを記述するとすべてのコントローラ^にレイアウトが継承される
- 部分テンプレ用のファイルはファイル名の前に_をつける
- renderメソッドを使って_と拡張子を除いたもの""で囲う
->ex)ファイル名shared/_sidebar.html.erb
の場合
<%= render "sidebar"%>
- 主キー(idカラム)
Rake
- Rakeとは...ビルドツール、とは...指定した一連の手順にしたがってファイルの依存関係を調べ自動的にコマンドを実行するソフトウェア
テーブルのあれこれ
- テーブルのカラム=モデルの属性
- モデルは単数形
- マイグレーションによって自動的にテーブル内のカラムを定義
-
null: fales
によって空の値は保存されない - dbを古いバージョンに戻すことは可能
- インデックスをカラムに加えるとによって索引機能が高速化するがメモリは食う
add_index
で追加可能 - 実用化を目指すサービスにするのであれば必ず必要になる
- サイトを公開する前にあらかじめdbに初期化用のデータのことをシードデータという
レコードの作成と更新の流れ
newアクションで作成、ビューでレンダリング、クリエイトアクションにフォームの送信
エディットアクションからビューでレンダリング、フォームの送信アップデートアクションで保存
- 基本モデルのデストロイメソッドはSQLのデリート文を実行してテーブルからレコードを完全に消してしまう
しかしレコードに残したまま削除状態にもできる。目的としてはユーザーの復活がある - テーブルのレコードを作成更新する時にはエラーメッセージを出してくれるバリデーションを設ける
レコードの取り出しと検索
-
find_by
はカラムを使ってレコードを検索、最初に一致したものを返す - クエリーメソッドを使うと検索条件を読みやすいコードで記述できる
- 一番使われるのは
where
メソッド - プレースホルダーがあると単純なwhere文では作れない検索条件を指定できる
リソースとパスの指定
-
link_to,redirect_to
メソッドではパスの指定ができる - コントローラのアクションを表すパスを「
リソース名_path
」の形でメソッド取得できる
例:index...books_path /books
show....book_path(book) /books/id
↑でidパラメータが取れる - RESTは機能ではなくリソースを中心にして物事を考えること
- present?で空か確認できる<-バリデーション
コントローラの変更
def search @books = book.search(params[:q])
*qは検索ワード
モデル追加
render index end
さらにモデルクラスに追加で
-
アクションは短めに
-
長くなりそうな場合はモデルクラスに機能を移す
-
コントローラとテンプレートは別のオブジェクトなので使えるメソッドは基本変わる
-
タグをタグとして出力するには
<%== %>
を使う -
ヘルパーモジュールは全てのテンプレートにミックスインをされるヘルパーモジュールとコントローラには特別な関係がない
-
image_tag
メソッド
image_tag
(“画像ファイル名”,”ハッシュでオプション”) -
レイアウトテンプレートは全体の枠となる
-
プレースホルダーがあると単純なwhere文では作れない検索条件を指定できる
-
インスタンス変数
@book
の綴りをまちがえると、NoMethodErrorというエラーが表示される
モデルとフォームの連携の流れ
- コントローラでモデルを取り出し、ビューでレンダリングし、編集した内容をコントローラでモデルに保存
- フォームの送金先のパスとHTTPメソッドを自分で指定したいときはurlオプションとメソッドオプションを指定
form_for @book, URL: book_path(@book),method: :path
- renderメソッドにおいての、
form: form
は部分テンプレにローカル変数formを渡すという指定の意
- ラジオボタン、選択リスト、日付と時刻の選択、ファイルのアップロードもできる
- 時としてストロングパラメータの無効化が必要。ただし一般公開時は必要
- config/application.rbからメッセージの日本語化ができる『国際化』gemからも設定できる
- Yamlとはデータ形式またはファイル形式の1つで配列やハッシュを人間に読みやすい形で記述できるようにしたもの
テスト駆動開発
テストを書く→テストが失敗することを確認する→テストが成功するように実装する→リファクタリング(テストが成功状態のままプログラムを綺麗にする)
- テストコードは本体コードよりも丁寧に書く
- アサーションメソッドである条件が成立しているかどうかをチェックする
- テスト前にはマイグレーションを実行しないとエラーが発生することがある
- 自分のアカウント情報を扱う場合、単独リソースとして扱い、resource :(扱う情報)は単数で表記
モデル間の関連付け
1対多 has_many :複数形、belongs_to :単数
1対1 has_one :単数、 belongs_to :単数
リソースのネスト
- ネストされたリソースは
resources :books do resources :zaikos end
でネストできる - いいね機能を実装するにはvoteモデルを利用することでできる