-
注意:プログラミング歴29日の初心者が書いています
-
注意:間違っていたら優しく教えてください(喜びます)
「Ruby on Rails チュートリアル実例を使ってRailsを学ぼう」
https://railstutorial.jp/
素晴らしいチュートリアルに感謝します。
4.1.1 組み込みヘルパー
組み込み関数ってなんですか
組み込み関数とは、プログラミング言語がもともと用意してくれている関数のことです。
ビルトイン関数とも言います。
ヘルパーってなんですか
viewで使える関数のことをrailsではヘルパーと呼んでいます。
つまり、
「組み込みヘルパー」とは
-
「railsがもともと用意してくれている」
-
「viewで使える関数」
のことです。
4.1.2 カスタムヘルパー
カスタムヘルパーってなんですか
-
「自分でカスタムした(自分で作る)」
-
「viewで使える関数」
ということになります。
リスト 4.2: full_titleヘルパーを定義する
「Home」ページにアクセスした際に、Home | Ruby on Rails Tutorial Sample App
ではなく、 Ruby on Rails Tutorial Sample App
のみを表示させたい。
しかし、現状のコードのまま実装を進めると、|(縦棒)
が残ってしまいます。
「full_title」関数(ヘルパー)を作って、|(縦棒)
が残らないようにしましょう。
viewで使いたい関数はhelperディレクトリ内のファイルに記述する
これです。ここで言いたいのは多分これです。
「viewで使いたい関数はhelperディレクトリ内のファイルに記述すること」
ヘルパーの中身
module ApplicationHelper
# ページごとの完全なタイトルを返します。
def full_title(page_title = '') #1
base_title = "Ruby on Rails Tutorial Sample App" #2
if page_title.empty? #3
base_title #4
else
page_title + " | " + base_title #5
end
end
end
#1: full_title関数の定義・引数page_title = ''
は、『引数としてpage_title
をとる。引数の指定がない場合は' '
を引数とする』という意味です。
#2: 変数base_title
に"Ruby on Rails Tutorial Sample App"
を代入。
#3: page_title
に対して.empty?
メソッドを用いて、変数内に値が存在するかどうかで条件分岐させます。
#4: .empty?
メソッドは、変数が空ならTrue
を返します。 page_title
が空のとき、base_titile
のみを返します。
(ちなみに、Rubyではメソッドがtrueまたはfalseを返す場合、メソッド名に?がついています。)
#5: 変数内に値が存在する場合、page_title
と|(縦棒)
とbase_title
を返します。
application_helper.rb
に書き込まれた上記の内容は、railsの力によって、自動的にapplication.html.erb
で使用可能になります。
apprication.html.erbの中身
<title><%= full_title(yield(:title)) %></title>
タイトルタグのコードです。
ヘルパーで定義した、「full_title」関数を呼び出しています。
引数には、yieldメソッドでページごとにprovideで設定してあるタイトルを呼び出しています。
Homeページから「Home | 」を取り除く
まずはテストから作り初めて、それからテストを通す実装をします。
test "should get home" do
get static_pages_home_url
assert_response :success
assert_select "title", "Ruby on Rails Tutorial Sample App"#←ココ
end
home_urlのgetリクエストに対して、
titleは"Ruby on Rails Tutorial Sample App"
を表示
というテストです。
rails test
すると当然失敗します。
なぜなら、home.html.erb
でprovide
メソッドがタイトルとして"Home"を指定しているからです。
テストを通すためには、
home.html.erb
から、provide
メソッドの行を取り除きます。
4.3.2 ブロック
ブロックは、メソッドの引数として渡すことのできる処理のかたまりです。
{}波括弧
やdo ... end
の部分がブロックです。
test "should get home" do
get static_pages_home_url
assert_response :success
assert_select "title", "Ruby on Rails Tutorial Sample App"
end
テスト文も、じつはtest
メソッドが、引数としてブロックをとっています。
do ... end
で挟まれた処理がtest
メソッドの引数になっています。
4.4.5 ユーザークラス
class User
attr_accessor :name, :email #アクセサメソッド
def initialize(attributes = {}) #initializeメソッド
@name = attributes[:name]
@email = attributes[:email]
end
def formatted_email #インスタンスメソッドの定義
"#{@name} <#{@email}>"
end
end
#アクセサメソッド
インスタンス変数に、クラス外からアクセスできるようになります。
#initializeメソッド
User.newを実行すると自動的に呼び出されるメソッドです。
.newと同時に実行されます。
#インスタンスメソッドの定義
メソッドを呼び出すことで、
"ユーザー名 <メールアドレス>"という文字列を返すメソッドです。
特に意味はないです。
user = User.new(name: "Michael Hartl", email: "mhartl@example.com")
上記のように使えます。