Rails風味のRuby | rails チュートリアル 8

第4章 Rails風味のRubyの勉強メモ

helperを使い、titleを修正する。

前回までのtitleの欠点

application.html.erbのタイトルタグが、

<title><%= yield(:title) %> | Ruby on Rails Tutorial Sample App</title>

となっているため、表示したいviewに、

<% provide(:title, "Contact") %>

 のように、記述がないと、ページのタイトルが、
「 | Ruby on Rails Tutorial Sample App」
のようになってしまう。

ページタイトルが正しく表示されない問題を解決する

full_titleというヘルパーを作成して、解決する。

application_helper.rbを修正します。

module ApplicationHelper
  # ページごとの完全なタイトルを返します。
  def full_title(page_title = '')
    base_title = "Ruby on Rails Tutorial Sample App"
    if page_title.empty?
      base_title
    else
      page_title + " | " + base_title
    end
  end
end

そして、application.html.erbのタイトルタグ周りを

<title><%= full_title(yield(:title)) %></title>

このように修正する。

すると、タイトルに「|(縦罫線)」が表示されなくなる。

文字列とメソッド

rubyの文字列の仕組みについて

$ bundle rails c
Running via Spring preloader in process 26530
Loading development environment (Rails 5.1.2)

rails consoleで、検証しながら学ぶ。

整数の足し算

[1] pry(main)> 17 + 42
=> 59

文字列の足し算

[2] pry(main)> "foo"+ "bar"
=> "foobar"

展開式を使用して、文字列を表示


[3] pry(main)> first_name = "Michael"
=> "Michael"
[4] pry(main)> "#{first_name} Hartl"
=> "Michael Hartl"

[5] pry(main)> last_name = "Hartl"
=> "Hartl"
[6] pry(main)> first_name + " " + last_name
=> "Michael Hartl"
[7] pry(main)> "#{first_name} #{last_name}"
=> "Michael Hartl"

puts print

putsを使用して出力すると、改行文字である\nが自動的に出力の末尾に追加する。
printは、改行文字を追加しない。

[8] pry(main)> puts "foo"
foo
=> nil
[9] pry(main)> print "foo"
foo=> nil

シングルクォートと、ダブルクォート

Rubyはシングルクォート文字列の中では式展開を行わない。

ダブルクォート文字列を用いた文字列で#のような特殊な文字を使いたい場合は、この文字をバックスラッシュでエスケープ (escape) を行えば、表示できる。

[10] pry(main)> '#{first_name} bar'
=> "\#{first_name} bar"
[11] pry(main)> "#{first_name} bar"
=> "Michael bar"
[12] pry(main)> "\#{first_name} bar"
=> "\#{first_name} bar"

オブジェクト

Rubyでは、あらゆるものがオブジェクト、文字列やnilですらオブジェクトです。

length、emptyメソッドで試す。

[13] pry(main)> "foobar".length
=> 6
[14] pry(main)> "foobar".empty?
=> false
[15] pry(main)> "".empty?
=> true
[16] pry(main)> nil.nil?
=> true

empty?メソッドの末尾にある疑問符に注目。
Rubyでは、メソッドがtrueまたはfalseという論理値 (boolean) を返すことを、末尾の疑問符で示す慣習があります。

また、Rubyのオブジェクトのうち、オブジェクトそのものの論理値がfalseになるのは、false自身とnilの2つしかありません。

なお、「!!」(「バンバン (bang bang)」と読みます) という演算子を使うと、そのオブジェクトを2回否定し、どんなオブジェクトも強制的に論理値に変換できる。

[20] pry(main)> nil
=> nil
[21] pry(main)> !!nil
=> false
[22] pry(main)> !nil
=> true

メソッドチェーンの利用

[18] pry(main)> nil.to_s.empty?
=> true

メソッドの定義

Railsコンソールでも、メソッドを定義することができます。

メソッドを呼び出すときは、メソッドの引数や、()も省略することも可能

※ defというキーワードを使ってメソッドを定義していることに注目!

[47] pry(main)> def string_message(str = '')
[47] pry(main)*   if str.empty?
[47] pry(main)*     "It's an empty string!"
[47] pry(main)*   else
[47] pry(main)*     "The string is nonempty."
[47] pry(main)*   end
[47] pry(main)* end
=> :string_message
[48] pry(main)> puts string_message("")
It's an empty string!
=> nil
[49] pry(main)> puts string_message("1")
The string is nonempty.
=> nil
[50] pry(main)> puts string_message
It's an empty string!
=> nil

配列と範囲演算子

.split(‘x’)などで、特定の順序を持つ要素のリストである配列 (array)に変換することが可能。

[52] pry(main)> "foo bar     baz".split
=> ["foo", "bar", "baz"]
[53] pry(main)> "fooxbarxbazx".split('x')
=> ["foo", "bar", "baz"]

いろいろなメソッド

[54] pry(main)> a = [42, 8, 17] #配列を作成
=> [42, 8, 17]
[55] pry(main)> a.first #先頭のものを取り出す
=> 42
[56] pry(main)> a.second #二つ目のものを取り出す
=> 8
[57] pry(main)> a.last #最後のものを取り出す
=> 17
[58] pry(main)> a.last == a[-1] #順番を指定して取り出す。( -1 で末尾のものを指定)
=> true
[59] pry(main)> a[-2] #末尾から2番目のものを取り出す。
=> 8
[60] pry(main)> a[-4] #末尾から4番目、、このaの場合はエラー
=> nil
[61] pry(main)> a[-3] #末尾から3つめを取り出す
=> 42
[62] pry(main)> a.length #配列の個数を取り出す
=> 3
[63] pry(main)> a.include?(42) #この配列に42が含まれているかを判定
=> true
[64] pry(main)> a.sort # 昇順に並び替える
=> [8, 17, 42]
[65] pry(main)> a.sort! # !をつけることで、破壊的なメソッドになる。a自体を変更する。
=> [8, 17, 42]
[66] pry(main)> a.push(6) # 末尾に6を追加する
=> [8, 17, 42, 6]
[67] pry(main)> a.join(', ') # カンマ+スペースを使って連結して配列化
=> "8, 17, 42, 6"
[68] pry(main)> (0..9).to_a #to_aメソッドを使用して配列に変換
=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 

他にも

[76] pry(main)> b = %w[foo bar baz quux]
=> ["foo", "bar", "baz", "quux"]
[77] pry(main)> b[0..2]
=> ["foo", "bar", "baz"]
[78] pry(main)> b[2..-1]
=> ["baz", "quux"]
[79] pry(main)> c = (0..9).to_a
=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[80] pry(main)> c[2..-1]
=> [2, 3, 4, 5, 6, 7, 8, 9]
[84] pry(main)> ('a'..'z').to_a.shuffle[0..7].join
=> "bjfnrhlv"
[111] pry(main)> "abcde".split('')
=> ["a", "b", "c", "d", "e"]

文字列をシャッフルする

"baforo".split('').to_a.shuffle.join
=> "ofbaro"

ハッシュ

文字列をキーとして使用できるのが良い点。

しかし、ハッシュでは要素の「並び順」が保証されない。

[1] pry(main)> user = {}
=> {}
[2] pry(main)> user["first_name"] = "Michael"
=> "Michael"
[3] pry(main)> user["last_name"] = "Hartl"
=> "Hartl"
[4] pry(main)> user["first_name"]
=> "Michael"
[5] pry(main)> user
=> {
    "first_name"=>"Michael",
    "last_name"=>"Hartl"
   }

未定義のものは、nil

[10] pry(main)> user = { :name => "Michael Hartl", :email => "michael@example.com" }
=> {:name=>"Michael Hartl", :email=>"michael@example.com"}
[11] pry(main)> user[:name]
=> "Michael Hartl"
[12] pry(main)> user[:password]
=> nil

Ruby 1.9からは、どちらでも定義可能

[13] pry(main)> h1 = { :name => "Michael Hartl", :email => "michael@example.com" }
=> {:name=>"Michael Hartl", :email=>"michael@example.com"}
[14] pry(main)> h2 = { name: "Michael Hartl", email: "michael@example.com" }
=> {:name=>"Michael Hartl", :email=>"michael@example.com"}
[15] pry(main)> h1 == h2
=> true

# { :name => "Michael Hartl" }
#  と、
# { name: "Michael Hartl" }
# というコードは等価になります

application.html.erbのlinkタグを表示するコードも、実は、書き換えられる。

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

クラス継承

※ classというキーワードを使って継承が可能なクラスを定義していることに注目

[1] pry(main)> class Word < String
[1] pry(main)*   def palindrome?
[1] pry(main)*     self == self.reverse
[1] pry(main)*   end
[1] pry(main)* end
=> :palindrome?
[2] pry(main)> s = Word.new("level")
=> "level"
[3] pry(main)> s.palindrome?
=> true
# WordはStringで扱える全てのメソッドを継承しているので、以下のメソッドも使用できる。
[4] pry(main)> s.length
=> 5

Rubyでは組み込みの基本クラスの拡張が可能なため、このような書き方も可能ではある。

[5] pry(main)> class String [5] pry(main)* def palindrome? [5] pry(main)* self == self.reverse [5] pry(main)* end [5] pry(main)* end => :palindrome? [6] pry(main)> "deified".palindrome? => true

railsのコントローラーも同じ

作成してきたrailsアプリも、同じような継承が行われている

class StaticPagesController < ApplicationController
  def home
  end

  def help
  end

  def about
  end

  def contact
  end
end

親を辿って見るt、、

[1] pry(main)> controller = StaticPagesController.new
=> #
[2] pry(main)> controller.class
=> StaticPagesController
[3] pry(main)> controller.class.superclass
=> ApplicationController
[4] pry(main)> controller.class.superclass.superclass
=> ActionController::Base
[5] pry(main)> controller.class.superclass.superclass.superclass
=> ActionController::Metal
[6] pry(main)> controller.class.superclass.superclass.superclass.superclass
=> AbstractController::Base
[7] pry(main)> controller.class.superclass.superclass.superclass.superclass.superclass
=> Object

次回は、第5章 レイアウトを作成するから

コメント

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

内容に問題なければ、下記の「コメントを送信する」ボタンを押してください。


  1. KATOON.NET
  2. TRASH
  3. Rails風味のRuby | rails チュートリアル 8