LoginSignup
0
0

More than 3 years have passed since last update.

Railsチュートリアル 第4章 - 組み込みヘルパーの解説からカスタムヘルパーの実装まで

Posted at

組み込みヘルパー

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

Railsチュートリアル本文によれば、大雑把には以下の動作内容となるそうです。

  • Railsの組み込み関数stylesheet_link_tagを呼び出している
  • application.cssを全てのメディアタイプで使えるようにしている

Railsチュートリアル本文は、以下の概念についてこれから学習するともあります。期待して待ちましょう。

  • Railsの組み込み関数
  • カッコを使わないメソッド呼び出し
  • シンボル
  • ハッシュ

カスタムヘルパー

タイトル行の現在の挙動

現在、app/views/layouts/application.html.erbにおけるタイトル行の定義は以下のようになっています。

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

例えば、app/views/static_pages/home.html.erbに以下のような変更を加えた上で、Webブラウザで開発環境の/homeを表示したらどうなるでしょうか。

app/views/static_pages/home.html.erb
- <% provide(:title, "Home") %>
+
  <h1>Sample App</h1>
  <p>
    This is the home page for the
    <a href="https://railstutorial.jp/">Ruby on Rails Tutorial</a>
    sample application.
  </p>

スクリーンショット 2019-08-16 10.10.14.png

先頭に余分な縦棒 | が残ってしまっていますね。この縦棒を消すためにはどうすればよいのでしょうか。

full_titleヘルパーを定義する

以下のようなヘルパーを定義する、というのが一つの方法です。

app/helpers/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

このヘルパーを使うことにより、以下のようにレイアウトをシンプルにすることができます。

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

変更前後のapp/views/layouts/application.html.erbの内容差分は以下のとおりになります。

app/views/layouts/application.html.erb
 <!DOCTYPE html>
 <html>
   <head>
-    <title><%= yield(:title) %> | Ruby on Rails Tutorial Sample App</title>
+    <title><%= full_title(yield(:title)) %></title>
     <%= csrf_meta_tags %>

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

Homeページに基本タイトルのみを表示するようにする

まず、テストを以下のように書き換えます。

test/controllers/static_pages_controller_test.rb

rails testしてみます。

bash
# rails test
...略

 FAIL["test_should_get_home", StaticPagesControllerTest, 0.8954415000043809]
 test_should_get_home#StaticPagesControllerTest (0.90s)
        <Ruby on Rails Tutorial Sample App> expected but was
        <Home | Ruby on Rails Tutorial Sample App>..
        Expected 0 to be >= 1.
        test/controllers/static_pages_controller_test.rb:17:in `block in <class:StaticPagesControllerTest>'

  5/5: [===================================] 100% Time: 00:00:00, Time: 00:00:00

Finished in 0.97713s
5 tests, 9 assertions, 1 failures, 0 errors, 0 skips

一つ失敗したテストがありますね。「Homeビューのtitle要素の内容が、テストケースで定義した内容と異なる」という失敗のようです。ひとまず、app/views/static_pages/home.html.erbの先頭行にある<% provide(:title, "Home") %>というコードを削除してみます。

app/views/static_pages/home.html.erb
- <% provide(:title, "Home") %> 
  <h1>Sample App</h1>
  <p>
    This is the home page for the
    <a href="https://railstutorial.jp/">Ruby on Rails Tutorial</a>
    sample application.
  </p>

再度rails testします。

bash
# rails test
...略

  5/5: [===================================] 100% Time: 00:00:00, Time: 00:00:00

Finished in 0.87270s
5 tests, 9 assertions, 0 failures, 0 errors, 0 skips

テストが成功するようになりました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0