RailsTutorial

【Ruby on Rails 独学】Railsチュートリアル 第4章Rails風味のRuby Rubyに関する知識を学ぶ

【RubyonRails独学記】Railsチュートリアル第4章
【目的別おすすめプログラミングスクール】
  • WebCampPRO
    |転職成功率98%!エンジニアとして転職したい人におすすめ
  • ポテパンキャンプ
    |Railsエンジニアとして自社開発企業に転職したい人におすすめ
  • テックアカデミー
    |オンラインでプログラミングを学びたい方におすすめ
  • Aidemy
    |AI(人工知能)分野特化のスクール。AIを学びたいならここ

4.1 動機

Rubyに関する知識と経験に挑む第4章。

sample_appにトピックブランチを作る。

$ git checkout -b rails-flavored-ruby

4.1.1 1 組み込みヘルパー

4.1.2 カスタムヘルパー

Railsのビューでは膨大な組み込み関数が使えるだけでなく、新しく作成することも可能。

【新しく作ったメソッド=カスタムヘルパー】

[full_title]というヘルパーを作成する。

[app/helpers/application_helper.rb]にリスト4.2のコードを追加し、[app/views/layouts/application.html.erb]を書き換え。

[test/controllers/static_pages_controller_test.rb]のhomeテスト部分に以下を追加

assert_select “title”, “Ruby on Rails Tutorial Sample App”

Homeページのビューからprovideの行を削除しテスト実行・

4.2 文字列とメソッド

rails consoleを使ってRubyを学んでいく。

まず以下で「.irbrc」ファイルを生成。

$ nano ~/.irbrc

リスト4.8のコードを入力し、Crtrl-Xと入力→yキーで離脱。
その後も何か表示されたりするが、Enterキーで離脱可能。

準備が整ったのでrails consoleを起動。

rails console

[box class=”box27″ title=”rails consoleについて”]1.rails consoleの中では何をしようとも何かを壊すことはまずありえない
2.rails consoleがおかしな挙動になったら、Ctrl-Cを押してコンソールから強制的に抜け出し可能
3.Ctrl-Dを押して正常にコンソールを終了させることも可能
4.Ctrl-Pまたは上矢印キーで以前実行したコマンドの再利用が可能[/box]

4.2.1 コメント

Rubyにおいてコメントはナンバー記号#から始まり、その行の終わりまでがコメントとして扱われ、コメントの内容は実行はされない。

4.2.2 文字列

ダブルクォート[“”]で囲むことで文字列を作成できる。
+演算子で文字列同士の結合も可能。

その他はProgateのRuby講座でもやったことなので割愛。

ダブルクォートでもシングルクォートでも同じように文字列の表示には使えるが、シングルクォートの場合には式展開ができないので注意。

シングルクォートは、ダブルクォートで書いた場合には何かしら意味を持ってしまうような特殊な文字列を純な文字列として残したい場合などでは非常に有用になる。

4.2.3 オブジェクトとメッセージ受け渡し

≪Ruby = あらゆものがオブジェクト ≫

≪オブジェクト = (いついかなる場合にも)メッセージに応答するもの≫

≪オブジェクトに渡されるメッセージ = メソッド≫
→メソッドの実体はオブジェクト内で定義されたメソッド

Rubyでは、メソッドがtrueまたはfaleseという理論値を返すことを末尾の疑問符で示す慣習がある。
ifを使って処理の流れを変更する場合などで有効。

>> s = “foobar”
>> if s.empty?
>> “The string is empty”
>> else
>> “The string is nonempty”
>> end
=> “The string is nonempty”
puts “x is not empty” if !x.empty?

Rubyでは後続するifでの条件式が真のときにだけ実行される式(後続if)を書くことでコードを非常に簡潔にすることが可能。
unlessキーワードも同様に使える。

4.2.4 メソッドの定義

Railsコンソールでもメソッドの定義は可能。

Rubyのメソッドには「暗黙の戻り値がある」ことに注意。
<暗黙の戻り値 = メソッド内で最後に評価された式の値が自動的に返される>

4.2.5 titleヘルパー再び

module ApplicationHelperについて。

モジュールは関連したメソッドをまとめる方法の1つで、includeメソッドを使ってモジュールを読み込むことができる。
Railsでは自動的にヘルパーモジュールを読み込むようになっているため、include行を書く必要がない。

4.3 他のデータ構造

Railsアプリケーションを書くために重要となる、いくつかのRubyのデータ構造について

4.3.1 配列と範囲演算子

≪配列 = 特定の順序を持つ要素のリスト≫

splitメソッドを使うと、文字列を自然に変換した配列を得ることができる。

>> “foo bar baz”.split # 文字列を3つの要素を持つ配列に分割する
=> [“foo”, “bar”, “baz”]

Rubyの配列でも他の言語同様にゼロオリジン(=配列の最初の要素のインデックスがゼロから始まること)を採用している。

配列の要素にアクセルするには角カッコ[]を使用する。

配列はlengthメソッドのような様々なメソッドに応答するが、基本的にその内容自体を変更はされない。
ただし、配列の内容を変更したい場合は、メソッドに対応する「破壊的」メソッドの使用で変更が可能になる。
Rubyでは破壊的メソッドの名前には元のメソッドの末尾に「!」を追加したものを使うのが慣習になっている。

.push(もしくは<<)で配列に要素の追加が可能。

4.3.2 ブロック

>> (1..5).each { |i| puts 2 * i }
2
4
6
8
10
=> 1..5

eachメソッドはブロックと呼ばれるその後ろ部分、つまり{ |i| puts 2 * i }の縦棒|で囲われた変数に範囲内のものをそれぞれに代入し、その後の指示を実行していく。
つまりここでは範囲1~5をそれぞれ変数iに順に代入し、puts 2*i を実行していくということに。

通常、ブロックであることを示すには波カッコ{}を用いるが、doとendで囲んでも良い。

>> (1..5).each do |i|
?> puts 2 * i
>> end
2
4
6
8
10
=> 1..5

ブロックには複数の行を記述可能。
RailsチュートリアルではRubyの慣習に従って、短い1行のブロックには波カッコを使い、長い1行や複数行のブロックにはdo..end記法を使う。

>> (1..5).each do |number|
?> puts 2 * number
>> puts ‘–‘
>> end
2

4

6

8

10

=> 1..5

4.3.3 ハッシュとシンボル

ハッシュは本質的には配列と同じだが、インデックスとして整数値以外のものも使える点が配列と異なる。

ハッシュと配列の重要な違いの1つが、ハッシュでは要素の並び順が保証されないという点。
要素の順序が重要である場合には、ハッシュではなく配列を使う必要がある。

railsでは、ハッシュのキーとしては文字列よりもシンボルを使うほうが普通。
シンボルは一見文字列のようにも見えるが、クォートで囲む代わりにコロンが前に置かれている。
例):name ←nameの前にコロンがあるため、文字列ではなくシンボル

>> user = { :name => “Michael Hartl”, :email => “michael@example.com” }
=> {:name=>”Michael Hartl”, :email=>”michael@example.com”}
>> user[:name] # :name に対応する値にアクセスする
=> “Michael Hartl”
>> user[:password] # 未定義のキーに対応する値にアクセスする
=> nil

ハッシュではシンボルをキーとして使うことが一般的なため、次のような新しい記法がサポートされた。

>> h1 = { :name => “Michael Hartl”, :email => “michael@example.com” }
=> {:name=>”Michael Hartl”, :email=>”michael@example.com”}
>> h2 = { name: “Michael Hartl”, email: “michael@example.com” }
=> {:name=>”Michael Hartl”, :email=>”michael@example.com”}
>> h1 == h2
=> true

2つ目の記法のように、ハッシュロケットを使わずとも、キーの名前の後にコロンを置き、その後に値を続けることで値を与えることができるようになった。

例えば、:nameはシンボルとして独立しているが、引数を伴わないname:は意味を持たない。
{ :name => “Michael Hartl” }

{ name: “Michael Hartl” }
は同じ意味を持つ。
人気なのは後者。

以下はハッシュの中にハッシュが使われている例

>> params = {} # ‘params’ というハッシュを定義する (‘parameters’ の略)。
=> {}
>> params[:user] = { name: “Akuma Taro”, email: “akumataro@example.com” }
=> {:name=>”Akuma Taro”, :email=>”akumataro@example.com”}
>> params
=> {:user=>{:name=>”Akuma Taro”, :email=>”akumataro@example.com”}}
>> params[:user][:email]
=> “akumataro@example.com”

配列や範囲オブジェクトと同様に、ハッシュもeachメソッドに応答する。

配列のeachメソッドの場合、ブロックの変数は1つだけだったが、ハッシュのeachメソッドの場合にはブロックの変数はキーと値の2つになっている点に注意。

>> flash = { success: “It worked!”, danger: “It failed.” }
=> {:success=>”It worked!”, :danger=>”It failed.”}
>> flash.each do |key, value|
?> puts “Key #{key.inspect} has value #{value.inspect}”
>> end
Key :success has value “It worked!”
Key :danger has value “It failed.”

4.3.4 CSS、再び

<%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>

メソッド呼び出しだが、Rubyでは丸カッコは使用しなくても良い。
また引数がハッシュでも、それがメソッド呼び出しの最後の引数である場合には、波カッコを省略可能。

4.4 Rubyにおけるクラス

Rubyではメソッドをまとめるのにクラスを使い、これらのクラスからインスタンスが生成されることでオブジェクトが作成される。

4.4.1 コンストラクタ

暗黙のリテラルコンストラクタ、明示的な名前付きコンストラクタ

4.4.2 クラス継承

superclassメソッド = クラス階層を調べるメソッド

>> s = String.new(“foobar”)
=> “foobar”
>> s.class # 変数sのクラスを調べる
=> String
>> s.class.superclass # Stringクラスの親クラスを調べる
=> Object
>> s.class.superclass.superclass # Ruby 1.9からBasicObjectが導入
=> BasicObject
>> s.class.superclass.superclass.superclass
=> nil

クラス階層をひたすらたどっていくと、Rubyにおけるすべてのクラスは最終的にスーパークラスを持たないBasicObjectクラスを継承している。
これが”Rubyではあらゆるものがオブジェクトである”ということの技術的な意味。

自分でクラスを作成して理解を深める。

4.4.3 組み込みクラスの変更

Rubyでは組み込みの基本クラスの拡張が可能。
→クラス設計者によって初めから組み込まれていたクラスも、自分で自由にクラスにメソッドの追加などの変更が可能

>> class String
>> # 文字列が回文であればtrueを返す
>> def palindrome?
>> self == self.reverse
>> end
>> end
=> :String
>> “deified”.palindrome?
=> true

ただし、

組み込みクラスの変更はきわめて強力なテクニックですが、大いなる力には大いなる責任が伴います (訳注: 「スパイダーマン」の名台詞)。このため、真に正当な理由がない限り、組み込みクラスにメソッドを追加することは無作法であると考えられています。

Railsの場合には組み込みクラスの変更を正当化できる理由はいくつもある。
例)Webアプリケーションにおいて、変数が絶対に空白にならないようにしたい場合等
そこでRailsではblank?メソッドをRubyに追加している。

>> “”.blank?
=> true
>> ” “.empty?
=> false
>> ” “.blank?
=> true
>> nil.blank?
=> true

4.4.4. コントローラクラス

RailsはRubyでできているが、Rubyそのものではない。

Railsのクラスには普通のRubyのようにふるまうものもあるが、多くのクラスでRailsによる影響を受けている。

そのためRubyとRailsでは切り離して学習する必要がある

4.4.5 ユーザークラス

sample_appのルートディレクトリに新しいファイルを生成し、リスト4.17のコードを書き込む。

4.5 最後に

先ほど作成したexample_user.rbファイルは今後使わないとのことなので削除

$ rm example_user.rb

リポジトリに変更をコミットし、トピックブランチからmasterブランチへチェックアウトしてトピックブランチをマージする。

リモートリポジトリにpushしたりHerokuにデプロイする前に、変更が既存の挙動に影響がないかをテストして確認。

その後リモートリポジトリにpushし、Herokuにデプロイして終了。

第3章:【Ruby on Rails 独学】Railsチュートリアル 第3章ほぼ静的なページの作成
第5章1:【Ruby on Rails 独学】Railsチュートリアル 第5章1レイアウトを作成する Bootstrap導入

COMMENT

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

error: Content is protected !!