Try T.M Engineer Blog

多摩市で生息するエンジニアが「アウトプットする事は大事だ」と思って始めたブログ

【Ruby on Railsチュートリアル(第4版)】第5章 レイアウトを作成する(演習と解答)

はじめに

このブログ記事は、私(Kodak)自身のRailsの勉強記録として書いています。
Ruby on Railsチュートリアル』の演習と解答をもくもくと書いているだけの記事なので、興味の無い方は軽くスルーしてあげてください。他にも、まだ『Railsチュートリアル』の演習に挑戦していない方、これから『Railsチュートリアル』をやるぞ!という方は(演習の解答の)ネタバレになりますので、スルーしてください。

Ruby on Rails チュートリアルとは?

Ruby業界でRailsを使い始めるなら、まず最初に初めるRails入門サイトです。
電子書籍版は有料ですが、Webサイトにあるオンライン版は無料なので、誰でも読む(Railsにチャレンジする)事ができます。
railstutorial.jp
全部で14章あり、かなりのボリュームですが、これを読む事でRailsの基礎を学ぶ事ができ、ちょっとしたWebアプリケーションを作れるレベルにはなれる?とのこと。
各章毎に演習問題が複数あり、これを解いていく事でRailsへの理解を深めていく事ができる様になっています。

環境について

Ruby 2.5.0-dev
Rails 5.1.4
・バージョン管理ツール:GitHub(https://github.com/Kodak4400)

演習と解答

5.1.1 ナビゲーション<演習>
1. Webページと言ったらネコ画像、というぐらいにはWebにはネコ画像が溢れていますよね。リスト 5.4のコマンドを使って、図 5.3のネコ画像をダウンロードしてきましょう。
【解答】以下の通り。

$ curl cdn.learnenough.com/kitten.jpg

2. mvコマンドを使って、ダウンロードしたkitten.jpgファイルを適切なアセットディレクトリに移動してください (参考: 5.2.1)。
【解答】以下の通り。

$ mv kitten.jpg app/assets/images/kitten.jpg

3. image_tagを使って、kitten.jpg画像を表示してみてください (図 5.4)。
【解答】以下の通り。(実機操作は割愛)

<%= link_to image_tag("kitten.jpg", alt: "Kitten Image"),
  'http://rubyonrails.org/' %>

5.1.2 BootstrapとカスタムCSS<演習>
1. リスト 5.10を参考にして、5.1.1.1で使ったネコ画像をコメントアウトしてみてください。また、ブラウザのHTMLインスペクタ機能を使って、コメントアウトするとHTMLのソースからも消えていることを確認してみてください。
【解答】以下の通り。(実機操作は割愛)

<%#= link_to image_tag("kitten.jpg", alt: "Kitten Image"),
  'http://rubyonrails.org/' %>

2. リスト 5.11のコードをcustom.scssに追加し、すべての画像を非表示にしてみてください。うまくいけば、Railsのロゴ画像がHomeページから消えるはずです。先ほどと同様にインスペクタ機能を使って、今度はHTMLのソースコードは残ったままで、画像だけが表示されなくなっていることを確認してみてください。
【解答】以下の通り。

/* app/assets/stylesheets/custom.scss */
img {
  display: none;
}

5.1.3 パーシャル(partial)<演習> 1. Railsがデフォルトで生成するheadタグの部分を、リスト 5.18のようにrenderに置き換えてみてください。ヒント: 単純に削除してしまうと後でパーシャルを1から書き直す必要が出てくるので、削除する前にどこかに退避しておきましょう。
【解答】以下の通り。

### [app/views/layouts/application.html.erb]
<!DOCTYPE html>
<html>
  <head>
    <title><%= full_title(yield(:title)) %></title>
    <%= render 'layouts/rails_default' %>
    <%= render 'layouts/shim' %>
</head>
<body>
  <%= render 'layouts/header' %>
  <div class="container">
   <%= yield %>
   <%= render 'layouts/footer' %>
  </div>
</body>
</html>

2. リスト 5.18のようなパーシャルはまだ作っていないので、現時点ではテストは redになっているはずです。実際にテストを実行して確認してみましょう。
【解答】以下の通り。

$rails t
Error:
StaticPagesControllerTest#test_should_get_help:
ActionView::Template::Error: Missing partial layouts/_rails_default with {:locale=>[:en], :formats=>[:html], :variants=>[], :handlers=>[:raw, :erb, :html, :builder, :ruby, :coffee, :jbuilder]}. 

3. layoutsディレクトリにheadタグ用のパーシャルを作成し、先ほど退避しておいたコードを書き込み、最後にテストが green に戻ることを確認しましょう。
【解答】以下の通り。

### [app/views/layouts/_rails_default.html.erb]
<%= csrf_meta_tags %>
<%= stylesheet_link_tag    'application', media: 'all',
  'data-turbolinks-track': 'reload' %>
<%= javascript_include_tag 'application',
  'data-turbolinks-track': 'reload' %>
$rails t
Finished in 4.254301s, 0.9402 runs/s, 1.8804 assertions/s.
4 runs, 8 assertions, 0 failures, 0 errors, 0 skips

5.2.2 素晴らしい構文を備えたスタイルシート<演習>
1. 5.2.2で提案したように、footerのCSSを手作業で変換してみましょう。具体的には、リスト 5.17の内容を1つずつ変換していき、リスト 5.20のようにしてみてください。
【解答】以下の通り。

/* app/assets/stylesheets/custom.scss */

/* footer */

footer {
  margin-top: 45px;
  padding-top: 5px;
  border-top: 1px solid $gray-medium-light;
  color: $gray-light;
  a {
    color: $gray;
    &:hover {
      color: $gray-darker;
    }
  }
  small {
    float: left;
  }
  ul {
    float: right;
    list-style: none;
    li {
      float: left;
      margin-left: 15px;
    }
  }
}

5.3.2 RailsのルートURL<演習>
1. 実は名前付きルートは、as:オプションを使って変更することができます。有名なFar Sideの漫画に倣って、Helpページの名前付きルートをhelfに変更してみてください (リスト 5.29)。
【解答】以下の通り。

### [config/routes.rb]
Rails.application.routes.draw do
  root 'static_pages#home'
  get '/help', to:'static_pages#help', as: 'helf'
  get '/about', to:'static_pages#about'
  get '/contact', to:'static_pages#contact'
end

2. 先ほどの変更により、テストが redになっていることを確認してください。リスト 5.28を参考にルーティングを更新して、テストを greenにして見てください。
【解答】以下の通り。

$ rails t
Error:
StaticPagesControllerTest#test_should_get_help:
NameError: undefined local variable or method `help_path' for #<StaticPagesControllerTest:0x00007fca69b1b698>
    test/controllers/static_pages_controller_test.rb:16:in `block in <class:StaticPagesControllerTest>'

3. エディタのUndo機能を使って、今回の演習で行った変更を元に戻して見てください。
【解答】以下の通り。

### [config/routes.rb]
Rails.application.routes.draw do
  root 'static_pages#home'
  get '/help', to:'static_pages#help'
  get '/about', to:'static_pages#about'
  get '/contact', to:'static_pages#contact'
end

5.3.3 名前付きルート<演習>
1. リスト 5.29のようにhelfルーティングを作成し、レイアウトのリンクを更新してみてください。
【解答】以下の通り。

### [config/routes.rb]
Rails.application.routes.draw do
  root 'static_pages#home'
  get '/help', to:'static_pages#help', as: 'helf'
  get '/about', to:'static_pages#about'
  get '/contact', to:'static_pages#contact'
end
$ rails routes
 Prefix Verb URI Pattern        Controller#Action
   root GET  /                  static_pages#home
   helf GET  /help(.:format)    static_pages#help
  about GET  /about(.:format)   static_pages#about
contact GET  /contact(.:format) static_pages#contact
### [app/views/layouts/_header.html.erb]
<header class="navbar navbar-fixed-top navbar-inverse">
  <div class="container">
    <%= link_to "sample app", root_path, id: "logo" %>
    <nav>
      <ul class="nav navbar-nav navbar-right">
        <li><%= link_to "Home",   root_path %></li>
        <li><%= link_to "Help",   helf_path %></li>
        <li><%= link_to "Log in", '#' %></li>
      </ul>
    </nav>
  </div>
</header>

2. 前回の演習と同様に、エディタのUndo機能を使ってこの演習で行った変更を元に戻してみてください。
【解答】以下の通り。

### [config/routes.rb]
Rails.application.routes.draw do
  root 'static_pages#home'
  get '/help', to:'static_pages#help'
  get '/about', to:'static_pages#about'
  get '/contact', to:'static_pages#contact'
end
$ rails routes
 Prefix Verb URI Pattern        Controller#Action
   root GET  /                  static_pages#home
   help GET  /help(.:format)    static_pages#help
  about GET  /about(.:format)   static_pages#about
contact GET  /contact(.:format) static_pages#contact
### [app/views/layouts/_header.html.erb]
<header class="navbar navbar-fixed-top navbar-inverse">
  <div class="container">
    <%= link_to "sample app", root_path, id: "logo" %>
    <nav>
      <ul class="nav navbar-nav navbar-right">
        <li><%= link_to "Home",   root_path %></li>
        <li><%= link_to "Help",   help_path %></li>
        <li><%= link_to "Log in", '#' %></li>
      </ul>
    </nav>
  </div>
</header>

5.3.4 リンクのテスト<演習>
1. footerパーシャルのabout_pathをcontact_pathに変更してみて、テストが正しくエラーを捕まえてくれるかどうか確認してみてください。
【解答】以下の通り。

### [app/views/layouts/_footer.html.erb]
<footer class="footer">
  <small>
    The <a href="http://railstutoril.jp/">Ruby on Rails Tutorial</a>
    by <a href="http://www.michaelhartl.com/">Michael Hartl</a>
  </small>
  <nav>
    <ul>
      <!-- <li><%#= link_to "About", about_path %></li> -->
      <li><%= link_to "About", contact_path %></li>
      <li><%= link_to "Contact", contact_path %></li>
      <li><a href="http://news.railstutorial.org/">News</a></li>
    </ul>
  </nav>
</footer>
$ rails t
Failure:
Expected at least 1 element matching "a[href="/about"]", found 0..
Expected 0 to be >= 1.

2. リスト 5.35で示すように、Applicationヘルパーで使っているfull_titleヘルパーを、test環境でも使えるようにすると便利です。こうしておくと、リスト 5.36のようなコードを使って、正しいタイトルをテストすることができます。ただし、これは完璧なテストではありません。例えばベースタイトルに「Ruby on Rails Tutoial」といった誤字があったとしても、このテストでは発見することができないでしょう。この問題を解決するためには、full_titleヘルパーに対するテストを書く必要があります。そこで、Applicationヘルパーをテストするファイルを作成し、リスト 5.37のFILL_INの部分を適切なコードに置き換えてみてください。ヒント: リスト 5.37ではassert_equal <期待される値>, <実際の値>といった形で使っていましたが、内部では==演算子で期待される値と実際の値を比較し、正しいかどうかのテストをしています。
【解答】以下の通り。

### [test/helpers/application_helper_test.rb]
require 'test_helper'

class ApplicationHelperTest < ActionView::TestCase
  test "full title helper" do
    assert_equal full_title,         "Ruby on Rails Tutorial Sample App"
    assert_equal full_title("Help"), "Help|Ruby on Rails Tutorial Sample App"
  end
end

5.4.1 Usersコントローラ<演習>
1. 表 5.1を参考にしながらリスト 5.41を変更し、users_new_urlではなくsignup_pathを使えるようにしてみてください。
【解答】以下の通り。

### [test/controllers/users_controller_test.rb]
require 'test_helper'

class UsersControllerTest < ActionDispatch::IntegrationTest
  test "should get signup" do
    get signup_url
    assert_response :success
  end
end

2. 先ほどの変更を加えたことにより、テストが redになったことを確認してください。なお、この演習はテスト駆動開発 (コラム 3.3) で説明した red/green のリズムを作ることを目的としています。このテストは次の5.4.2で greenになるよう修正します。
【解答】以下の通り。

$ rails t
Error:
UsersControllerTest#test_should_get_signup:
NameError: undefined local variable or method `signup_url' for #<UsersControllerTest:0x00007ffe7dd35260>
    test/controllers/users_controller_test.rb:5:in `block in <class:UsersControllerTest>'
### [config/routes.rb]
Rails.application.routes.draw do
  root 'static_pages#home'
  get '/help', to:'static_pages#help'
  get '/about', to:'static_pages#about'
  get '/contact', to:'static_pages#contact'
  get '/signup', to:'users#new'
end
$ rails t
Finished in 0.436722s, 16.0285 runs/s, 38.9264 assertions/s.
7 runs, 17 assertions, 0 failures, 0 errors, 0 skips

5.4.2 ユーザー登録用URL<演習>
1. もしまだ5.4.1.1の演習に取り掛かっていなければ、まずはリスト 5.41のように変更し、名前付きルートsignup_pathを使えるようにしてください。また、リスト 5.43で名前付きルートが使えるようになったので、現時点でテストが greenになっていることを確認してください。
前のテストで確認済み

2. 先ほどのテストが正しく動いていることを確認するため、signupルートの部分をコメントアウトし、テスト redになることを確認してください。確認できたら、コメントアウトを解除して greenの状態に戻してください。
【解答】以下の通り。

### [config/routes.rb]
Rails.application.routes.draw do
  root 'static_pages#home'
  get '/help', to:'static_pages#help'
  get '/about', to:'static_pages#about'
  get '/contact', to:'static_pages#contact'
#  get '/signup', to:'users#new'
end
$ rails t
Error:
SiteLayoutTest#test_layout_links:
ActionView::Template::Error: undefined local variable or method `signup_path' for #<#<Class:0x00007fa752129e58>:0x00007fa751440ea8>
    app/views/static_pages/home.html.erb:10:in `_app_views_static_pages_home_html_erb__1372035262442598662_70178306610940'
    test/integration/site_layout_test.rb:6:in `block in <class:SiteLayoutTest>'
### [config/routes.rb]
Rails.application.routes.draw do
  root 'static_pages#home'
  get '/help', to:'static_pages#help'
  get '/about', to:'static_pages#about'
  get '/contact', to:'static_pages#contact'
  get '/signup', to:'users#new'
end
$ rails t
Finished in 0.380467s, 18.3984 runs/s, 44.6819 assertions/s.
7 runs, 17 assertions, 0 failures, 0 errors, 0 skips

3. リスト 5.32の統合テストにsignupページにアクセスするコードを追加してください (getメソッドを使います)。コードを追加したら実際にテストを実行し、結果が正しいことを確認してください。ヒント: リスト 5.36で紹介したfull_titleヘルパーを使ってみてください。
【解答】以下の通り。

### [test/integration/site_layout_test.rb]
require 'test_helper'

class SiteLayoutTest < ActionDispatch::IntegrationTest

  test "layout links" do
    get root_path
    assert_template 'static_pages/home'
    assert_select "a[href=?]", root_path, count: 2
    assert_select "a[href=?]", help_path
    assert_select "a[href=?]", about_path
    assert_select "a[href=?]", contact_path
    get contact_path
    assert_select "title", full_title("Contact")
    get signup_path
  end
end
$ rails test:integration
Finished in 0.453475s, 2.2052 runs/s, 13.2312 assertions/s.
1 runs, 6 assertions, 0 failures, 0 errors, 0 skips

【Ruby on Railsチュートリアル(第4版)】第4章 Rails風味のRuby(演習と解答)

はじめに

このブログ記事は、私(Kodak)自身のRailsの勉強記録として書いています。
Ruby on Railsチュートリアル』の演習と解答をもくもくと書いているだけの記事なので、興味の無い方は軽くスルーしてあげてください。他にも、まだ『Railsチュートリアル』の演習に挑戦していない方、これから『Railsチュートリアル』をやるぞ!という方は(演習の解答の)ネタバレになりますので、スルーしてください。

Ruby on Rails チュートリアルとは?

Ruby業界でRailsを使い始めるなら、まず最初に初めるRails入門サイトです。
電子書籍版は有料ですが、Webサイトにあるオンライン版は無料なので、誰でも読む(Railsにチャレンジする)事ができます。
railstutorial.jp
全部で14章あり、かなりのボリュームですが、これを読む事でRailsの基礎を学ぶ事ができ、ちょっとしたWebアプリケーションを作れるレベルにはなれる?とのこと。
各章毎に演習問題が複数あり、これを解いていく事でRailsへの理解を深めていく事ができる様になっています。

環境について

Ruby 2.5.0-dev
Rails 5.1.4
・バージョン管理ツール:GitHub(https://github.com/Kodak4400)

演習と解答

4.2.2 文字列<演習>
1. city変数に適当な市区町村を、prefecture変数に適当な都道府県を代入してください。
【解答】以下の通り。

irb(main):008:0> city = "Tama"
=> "Tama"
irb(main):009:0> prefecture = "Tokyo"
=> "Tokyo"
irb(main):010:0>

2. 先ほど作った変数と式展開を使って、「東京都 新宿区」のような住所の文字列を作ってみましょう。出力にはputsを使ってください。
【解答】以下の通り。

irb(main):005:0> puts "#{prefecture}都 #{city}市"
Tokyo都 Tama市
=> nil
irb(main):006:0>

3. 上記の文字列の間にある半角スペースをタブに置き換えてみてください。(ヒント: 改行文字と同じで、タブも特殊文字です)
【解答】以下の通り。

irb(main):006:0> puts "#{prefecture}都\t#{city}市"
Tokyo都    Tama市
=> nil
irb(main):007:0>

4. タブに置き換えた文字列を、ダブルクォートからシングルクォートに置き換えてみるとどうなるでしょうか?
【解答】以下の通り。

irb(main):007:0> puts '#{prefecture}都\t#{city}市'
#{prefecture}都\t#{city}市
=> nil
irb(main):008:0>

4.2.3 オブジェクトとメッセージ受け渡し<演習>
1. "racecar" の文字列の長さはいくつですか? lengthメソッドを使って調べてみてください。
【解答】以下の通り。

irb(main):013:0> "racecar".length
=> 7
irb(main):014:0>

2. reverseメソッドを使って、"racecar"の文字列を逆から読むとどうなるか調べてみてください。
【解答】以下の通り。

irb(main):014:0> "racecar".reverse
=> "racecar"
irb(main):015:0>

3. 変数sに "racecar" を代入してください。その後、比較演算子 (==) を使って変数sとs.reverseの値が同じであるかどうか、調べてみてください。
【解答】以下の通り。

irb(main):007:0> s = "racecar"
=> "racecar"
irb(main):008:0> if s == s.reverse
irb(main):009:1> "同じ"
irb(main):010:1> else
irb(main):011:1> "違う"
irb(main):012:1> end
=> "同じ"
irb(main):013:0>

4. リスト 4.9を実行すると、どんな結果になるでしょうか? 変数sに "onomatopoeia" という文字列を代入するとどうなるでしょうか? ヒント: 上矢印 (またはCtrl-Pコマンド) を使って以前に使ったコマンドを再利用すると一からコマンドを全部打ち込む必要がなくて便利ですよ。)
【解答】以下の通り。

irb(main):033:0> puts "It's a palindrome!" if s == s.reverse
It's a palindrome!
=> nil
irb(main):034:0> s = "onomatopoeia"
=> "onomatopoeia"
irb(main):035:0> puts "It's a palindrome!" if s == s.reverse
=> nil
irb(main):036:0>

4.2.4 メソッドの定義<演習>
1. リスト 4.10のFILL_INの部分を適切なコードに置き換え、回文かどうかをチェックするメソッドを定義してみてください。ヒント: リスト 4.9の比較方法を参考にしてください。
【解答】以下の通り。

irb(main):049:0> def palindrome_tester(s)
irb(main):050:1>  if s == s.reverse
irb(main):051:2>   puts "It's a palindrome!"
irb(main):052:2>  else
irb(main):053:2>   puts "It's not a palindrome."
irb(main):054:2>  end
irb(main):055:1> end
=> :palindrome_tester
irb(main):056:0>

2. 上で定義したメソッドを使って “racecar” と “onomatopoeia” が回文かどうかを確かめてみてください。1つ目は回文である、2つ目は回文でない、という結果になれば成功です。
【解答】以下の通り。

irb(main):057:0> puts palindrome_tester("racecar")
It's a palindrome!
=> nil
irb(main):058:0> puts palindrome_tester("onomatopoeia")
It's not a palindrome.
=> nil
irb(main):059:0>

3. palindrome_tester("racecar")に対してnil?メソッドを呼び出し、戻り値がnilであるかどうかを確認してみてください (つまりnil?を呼び出した結果がtrueであることを確認してください)。このメソッドチェーンは、nil?メソッドがリスト 4.10の戻り値を受け取り、その結果を返しているという意味になります。
【解答】以下の通り。

irb(main):059:0> puts palindrome_tester("racecar").nil?
It's a palindrome!
true
=> nil
irb(main):060:0>

4.3.1 配列と範囲演算子<演習>
1. 文字列 “A man, a plan, a canal, Panama” を ", " で分割して配列にし、変数aに代入してみてください。
【解答】以下の通り。

irb(main):019:0> a = "A man, a plan, a canal, Panama".split(',')
=> ["A man", " a plan", " a canal", " Panama"]
irb(main):020:0>

2. 今度は、変数aの要素を連結した結果 (文字列) を、変数sに代入してみてください。
【解答】以下の通り。

irb(main):020:0> s = a.join
=> "A man a plan a canal Panama"
irb(main):021:0>

3. 変数sを半角スペースで分割した後、もう一度連結して文字列にしてください (ヒント: メソッドチェーンを使うと1行でもできます)。リスト4.10で使った回文をチェックするメソッドを使って、(現状ではまだ) 変数sが回文ではないことを確認してください。downcaseメソッドを使って、s.downcaseは回文であることを確認してください。
【解答】以下の通り。

irb(main):024:0> s = s.split(' ').join
=> "AmanaplanacanalPanama"
irb(main):025:0>

irb(main):098:0> def palindrome_tester(s)
irb(main):099:1>   if s == s.reverse
irb(main):100:2>     puts "It's a palindrome!"
irb(main):101:2>   else
irb(main):102:2>     puts "It's not a palindrome."
irb(main):103:2>   end
irb(main):104:1> end
=> :palindrome_tester
irb(main):105:0> palindrome_tester(s)
It's a palindrome!
=> nil
irb(main):106:0>

4. aからzまでの範囲オブジェクトを作成し、7番目の要素を取り出してみてください。同様にして、後ろから7番目の要素を取り出してみてください。(ヒント: 範囲オブジェクトを配列に変換するのを忘れないでください)
【解答】以下の通り。

=> ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]
irb(main):006:0> obj[6]
=> "g"
irb(main):007:0> obj[-7]
=> "t"
irb(main):008:0>

4.3.2 ブロック<演習>
1. 範囲オブジェクト0..16を使って、各要素の2乗を出力してください。
【解答】以下の通り。

irb(main):010:0> (0..16).map { |i| i**2 }
=> [0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225, 256]
irb(main):011:0>

2. yeller (大声で叫ぶ) というメソッドを定義してください。このメソッドは、文字列の要素で構成された配列を受け取り、各要素を連結した後、大文字にして結果を返します。例えばyeller([’o’, ’l’, ’d’])と実行したとき、"OLD"という結果が返ってくれば成功です。ヒント: mapとupcaseとjoinメソッドを使ってみましょう。
【解答】以下の通り。

irb(main):016:0> def yeller(a)
irb(main):017:1>   a.map(&:upcase).join
irb(main):018:1> end
=> :yeller
irb(main):019:0> yeller(['o','l','d'])
=> "OLD"
irb(main):020:0>

3. random_subdomainというメソッドを定義してください。このメソッドはランダムな8文字を生成し、文字列として返します。ヒント: サブドメインを作るときに使ったRubyコードをメソッド化したものです。
【解答】以下の通り。

irb(main):029:0> def random_subdomain
irb(main):030:1>   8.times { print ('A'..'Z').to_a[rand(26)] }
irb(main):031:1> end
=> :random_sobdomain
irb(main):032:0> random_subdomain
XKIANEHV=> 8
irb(main):033:0>

4. リスト 4.12の「?」の部分を、それぞれ適切なメソッドに置き換えてみてください。ヒント:split、shuffle、joinメソッドを組み合わせると、メソッドに渡された文字列 (引数) をシャッフルさせることができます。
【解答】以下の通り。

irb(main):033:0> def string_shuffle(s)
irb(main):034:1>   s.split('').shuffle.join
irb(main):035:1> end
=> :string_shuffle
irb(main):036:0> string_shuffle("foobar")
=> "broofa"
irb(main):037:0>

4.3.3 ハッシュとシンボル<演習>
1. キーが’one’、’two’、’three’となっていて、それぞれの値が’uno’、’dos’、’tres’となっているハッシュを作ってみてください。その後、ハッシュの各要素をみて、それぞれのキーと値を"’#{key}’のスペイン語は’#{value}’"といった形で出力してみてください。
【解答】以下の通り。

irb(main):017:0> h = { one: "uno", two: "dos", three: "tres" }
=> {:one=>"uno", :two=>"dos", :three=>"tres”}
irb(main):018:0> h.each do |key, value|
irb(main):019:1*  puts "#{key}のスペイン語は#{value}"
irb(main):020:1> end
oneのスペイン語はuno
twoのスペイン語はdos
threeのスペイン語はtres
=> {:one=>"uno", :two=>"dos", :three=>"tres"}
irb(main):021:0>

2. person1、person2、person3という3つのハッシュを作成し、それぞれのハッシュに:firstと:lastキーを追加し、適当な値 (名前など) を入力してください。その後、次のようなparamsというハッシュのハッシュを作ってみてください。1.) キーparams[:father]の値にperson1を代入、2). キーparams[:mother]の値にperson2を代入、3). キーparams[:child]の値にperson3を代入。最後に、ハッシュのハッシュを調べていき、正しい値になっているか確かめてみてください。(例えばparams[:father][:first]がperson1[:first]と一致しているか確かめてみてください)
【解答】以下の通り。

irb(main):041:0> person1 = { first:'tanaka', last:'tarou' }
=> {:first=>"tanaka", :last=>"tarou"}
irb(main):042:0> person2 = { first:'yamada', last:'takashi' }
=> {:first=>"yamada", :last=>"takashi"}
irb(main):043:0> person3 = { first:'fukuda', last:'shinya' }
=> {:first=>"fukuda", :last=>"shinya"}
irb(main):044:0> params = { father:person1, mother:person2, child:person3 }
=> {:father=>{:first=>"tanaka", :last=>"tarou"}, :mother=>{:first=>"yamada", :last=>"takashi"}, :child=>{:first=>"fukuda", :last=>"shinya"}}
irb(main):045:0> params[:father][:first]
=> "tanaka"
irb(main):046:0> person1[:first]
=> "tanaka"
irb(main):047:0>

3. userというハッシュを定義してみてください。このハッシュは3つのキー:name、:email、:password_digestを持っていて、それぞれの値にあなたの名前、あなたのメールアドレス、そして16文字からなるランダムな文字列が代入されています。
【解答】以下の通り。

irb(main):001:0> user = { name:"Kodak", email:"Kodak@email.com", password_digest:"0123456789101112" }
=> {:name=>"Kodak", :email=>"Kodak@email.com", :password_digest=>"0123456789101112"}
irb(main):002:0>

4. Ruby API (訳注: もしくはるりまサーチ) を使って、Hashクラスのmergeメソッドについて調べてみてください。次のコードを実行せずに、どのような結果が返ってくるか推測できますか? 推測できたら、実際にコードを実行して推測があっていたか確認してみましょう。
【解答】以下の通り。

irb(main):047:0> { "a"=>100, "b"=>200 }.merge({ "b"=>300 }) #{"a"=>100, "b"=>300}という解が出力されると推測。
=> {"a"=>100, "b"=>300}
irb(main):048:0>

4.4.1 コンストラクタ<演習>
1. 1から10の範囲オブジェクトを生成するリテラルコンストラクタは何でしたか? (復習です)
【解答】以下の通り。

irb(main):006:0> a = 1..10
=> 1..10

2. 今度はRangeクラスとnewメソッドを使って、1から10の範囲オブジェクトを作ってみてください。ヒント: newメソッドに2つの引数を渡す必要があります
【解答】以下の通り。

irb(main):007:0> range1 = Range.new(1, 10)
=> 1..10

3. 比較演算子==を使って、上記2つの課題で作ったそれぞれのオブジェクトが同じであることを確認してみてください。
【解答】以下の通り。

irb(main):006:0> a = 1..10
=> 1..10
irb(main):007:0> range1 = Range.new(1, 10)
=> 1..10
irb(main):008:0> range1 == a
=> true
irb(main):009:0>

4.4.2 クラス継承<演習>
1. Rangeクラスの継承階層を調べてみてください。同様にして、HashとSymbolクラスの継承階層も調べてみてください。
【解答】以下の通り。

irb(main):011:0> s = Range.new(1,10)
=> 1..10
irb(main):012:0> s.class
=> Range
irb(main):013:0> s.class.superclass
=> Object
irb(main):014:0> s.class.superclass.superclass
=> BasicObject
irb(main):015:0> s.class.superclass.superclass.superclass
=> nil
irb(main):016:0>

2. リスト 4.15にあるself.reverseのselfを省略し、reverseと書いてもうまく動くことを確認してみてください。 【解答】以下の通り。

irb(main):018:0> class Word < String
irb(main):019:1>   # 文字列が回文であればtrueを返す
irb(main):020:1>   def palindrome?
irb(main):021:2>     self == reverse
irb(main):022:2>   end
irb(main):023:1> end
=> :palindrome?
irb(main):024:0>
irb(main):025:0> b = Word.new("test")
=> "test"
irb(main):026:0> b.palindrome?
=> false
irb(main):027:0> c = Word.new("teet")
=> "teet"
irb(main):028:0> c.palindrome?
=> true
irb(main):029:0>

4.4.3 組み込みクラスの変更<演習>
1. palindrome?メソッドを使って、“racecar”が回文であり、“onomatopoeia”が回文でないことを確認してみてください。南インドの言葉「Malayalam」は回文でしょうか? ヒント: downcaseメソッドで小文字にすることを忘れないで。
【解答】以下の通り。

irb(main):029:0> class String
irb(main):030:1>   # 文字列が回文であればtrueを返す
irb(main):031:1>   def palindrome?
irb(main):032:2>     self == self.reverse
irb(main):033:2>   end
irb(main):034:1> end
=> :palindrome?
irb(main):035:0> "racecar".palindrome?
=> true
irb(main):036:0> "onomatopoeia".palindrome?
=> false
irb(main):037:0> "Malayalam".downcase.palindrome?
=> true
irb(main):038:0>

2. リスト 4.16を参考に、Stringクラスにshuffleメソッドを追加してみてください。ヒント: リスト 4.12も参考になります。
【解答】以下の通り。

irb(main):056:0> class String
irb(main):057:1>   # 文字列をShuffleする
irb(main):058:1>   def shuffle
irb(main):059:2>     self.split('').shuffle.join
irb(main):060:2>   end
irb(main):061:1> end
=> :shuffle
irb(main):062:0> "racecar".shuffle
=> "aarrcce"
irb(main):063:0>

3. リスト 4.16のコードにおいて、self.を削除してもうまく動くことを確認してください。
【解答】以下の通り。

irb(main):063:0> class String
irb(main):064:1>   # 文字列をShuffleする
irb(main):065:1>   def shuffle
irb(main):066:2>     split('').shuffle.join
irb(main):067:2>   end
irb(main):068:1> end
=> :shuffle
irb(main):069:0> "racecar".shuffle
=> "arcacer"
irb(main):070:0>

4.4.4 コントロールクラス<演習>
1. 第2章で作ったToyアプリケーションのディレクトリでRailsコンソールを開き、User.newと実行することでuserオブジェクトが生成できることを確認してみましょう。
【解答】以下の通り。

irb(main):001:0> u = User.new
=> #<User id: nil, name: nil, email: nil, created_at: nil, updated_at: nil>
irb(main):002:0>

2. 生成したuserオブジェクトのクラスの継承階層を調べてみてください。
【解答】以下の通り。

irb(main):008:0>
irb(main):009:0> u.class
=> User(id: integer, name: string, email: string, created_at: datetime, updated_at: datetime)
irb(main):010:0> u.class.superclass
=> ApplicationRecord(abstract)
irb(main):011:0> u.class.superclass.superclass
=> ActiveRecord::Base
irb(main):012:0> u.class.superclass.superclass.superclass
=> Object
irb(main):013:0> u.class.superclass.superclass.superclass.superclass
=> BasicObject
irb(main):014:0> u.class.superclass.superclass.superclass.superclass.superclass
=> nil
irb(main):015:0>

4.4.5 ユーザークラス<演習>
1. Userクラスで定義されているname属性を修正して、first_name属性とlast_name属性に分割してみましょう。また、それらの属性を使って "Michael Hartl" といった文字列を返すfull_nameメソッドを定義してみてください。最後に、formatted_emailメソッドのnameの部分を、full_nameに置き換えてみましょう (元々の結果と同じになっていれば成功です)
【解答】以下の通り。

irb(main):001:0> require './example_user'
=> true
irb(main):002:0> example = User.new
=> #<User:0x00007fde00408e78 @first_name=nil, @last_name=nil, @email=nil>
irb(main):003:0> example.first_name
=> nil
irb(main):004:0> example.last_name
=> nil
irb(main):005:0> example.email
=> nil
irb(main):006:0> example.first_name = "Michael"
=> "Michael"
irb(main):007:0> example.last_name = "Hartl"
=> "Hartl"
irb(main):008:0> example.email = "user@example.com"
=> "user@example.com"
irb(main):009:0> example.formatted_email
=> "Michael Hartl <user@example.com>"
irb(main):010:0>

2. "Hartl, Michael" といったフォーマット (苗字と名前がカンマ+半角スペースで区切られている文字列) で返すalphabetical_nameメソッドを定義してみましょう。
【解答】以下の通り。

irb(main):010:0> example.alphabetical_name
=> "Hartl, Michael"
irb(main):011:0>

3. full_name.splitとalphabetical_name.split(’, ’).reverseの結果を比較し、同じ結果になるかどうか確認してみましょう。
【解答】以下の通り。

irb(main):011:0> example.full_name.split
=> ["Michael", "Hartl"]
irb(main):012:0> example.alphabetical_name.split(', ').reverse
=> ["Michael", "Hartl"]
irb(main):013:0>

【Ruby on Railsチュートリアル(第4版)】第3章 ほぼ静的なページの作成(演習と解答)

はじめに

このブログ記事は、私(Kodak)自身のRailsの勉強記録として書いています。
Ruby on Railsチュートリアル』の演習と解答をもくもくと書いているだけの記事なので、興味の無い方は軽くスルーしてあげてください。他にも、まだ『Railsチュートリアル』の演習に挑戦していない方、これから『Railsチュートリアル』をやるぞ!という方は(演習の解答の)ネタバレになりますので、スルーしてください。

Ruby on Rails チュートリアルとは?

Ruby業界でRailsを使い始めるなら、まず最初に初めるRails入門サイトです。
電子書籍版は有料ですが、Webサイトにあるオンライン版は無料なので、誰でも読む(Railsにチャレンジする)事ができます。
railstutorial.jp
全部で14章あり、かなりのボリュームですが、これを読む事でRailsの基礎を学ぶ事ができ、ちょっとしたWebアプリケーションを作れるレベルにはなれる?とのこと。
各章毎に演習問題が複数あり、これを解いていく事でRailsへの理解を深めていく事ができる様になっています。

環境について

Ruby 2.5.0-dev
Rails 5.1.4
・バージョン管理ツール:GitHub(https://github.com/Kodak4400)

演習と解答

3.1 セットアップ<演習>
1. BitbucketがMarkdown記法のREADME (リスト 3.3) をHTMLとして正しく描画しているか、確認してみてください。
【解答】以下の通り。
f:id:special-moucom:20180707200309p:plain

2. 本番環境 (Heroku) のルートURLにアクセスして、デプロイが成功したかどうか確かめてみてください。
実機操作のため割愛。


3.2.1 静的なページの生成<演習>
1. Fooというコントローラを生成し、その中にbarとbazアクションを追加してみてください。
【解答】以下の通り。

$ rails g controller Foo bar baz
      create  app/controllers/foo_controller.rb
       route  get 'foo/baz'
       route  get 'foo/bar'
      invoke  erb
      create    app/views/foo
      create    app/views/foo/bar.html.erb
      create    app/views/foo/baz.html.erb
      invoke  test_unit
      create    test/controllers/foo_controller_test.rb
      invoke  helper
      create    app/helpers/foo_helper.rb
      invoke    test_unit
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/foo.coffee
      invoke    scss
      create      app/assets/stylesheets/foo.scss
$

2. コラム 3.1で紹介したテクニックを駆使して、Fooコントローラとそれに関連するアクションを削除してみてください。
【解答】以下の通り。

$ rails d controller Foo bar baz
      remove  app/controllers/foo_controller.rb
       route  get 'foo/baz'
       route  get 'foo/bar'
      invoke  erb
      remove    app/views/foo
      remove    app/views/foo/bar.html.erb
      remove    app/views/foo/baz.html.erb
      invoke  test_unit
      remove    test/controllers/foo_controller_test.rb
      invoke  helper
      remove    app/helpers/foo_helper.rb
      invoke    test_unit
      invoke  assets
      invoke    coffee
      remove      app/assets/javascripts/foo.coffee
      invoke    scss
      remove      app/assets/stylesheets/foo.scss
$

3.4.2 タイトルを追加する(Green)<演習>
1. StaticPagesコントローラのテスト (リスト 3.24) には、いくつか繰り返しがあったことにお気づきでしょうか? 特に「Ruby on Rails Tutorial Sample App」という基本タイトルは、各テストで毎回同じ内容を書いてしまっています。そこで、setupという特別なメソッド (各テストが実行される直前で実行されるメソッド) を使って、この問題を解決したいと思います。まずは、リスト 3.30のテストが green になることを確認してみてください (リスト 3.30では、2.2.2で少し触れたインスタンス変数や文字列の式展開というテクニックを使っています。それぞれ4.4.5と4.2.2で詳しく解説するので、今はわからなくても問題ありません)。
【解答】以下の通り。

### [static_pages_controller_test.rb]

require 'test_helper'

class StaticPagesControllerTest < ActionDispatch::IntegrationTest
  # setupメソッドの追加
  def setup
    @base_title = "Ruby on Rails Tutorial Sample App"
  end

  test "should get contact" do
    get static_pages_contact_url
    assert_response :success
    assert_select "title", "Contact|#{@base_title}"
  end
end
### [テストの実行]

$ rails t
/Users/Kodak/00_myfolder/00_devlop/03_Ruby_on_Rails/rails-tutorial/sample_app/db/schema.rb doesn't exist yet. Run `rails db:migrate` to create it, then try again. If you do not intend to use a database, you should instead alter /Users/Kodak/00_myfolder/00_devlop/03_Ruby_on_Rails/rails-tutorial/sample_app/config/application.rb to limit the frameworks that will be loaded.
Run options: --seed 19048

# Running:

Run options: --seed 19048

# Running:

・
・
・

# 正常終了した事を確認
Finished in 0.350625s, 11.4082 runs/s, 22.8164 assertions/s.
4 runs, 8 assertions, 0 failures, 0 errors, 0 skips



Finished in 0.370653s, 10.7918 runs/s, 21.5835 assertions/s.
4 runs, 8 assertions, 0 failures, 0 errors, 0 skips
$

3.4.3 レイアウトと埋め込みRuby(Refactor)<演習>
1. サンプルアプリケーションにContact (問い合わせ先) ページを作成してください (ヒント: まずはリスト 3.15を参考にして、/static_pages/contactというURLのページに「Contact | Ruby on Rails Tutorial Sample App」というタイトルが存在するかどうかを確認するテストを最初に作成しましょう。 次に、3.3.3でAboutページを作ったときのと同じように、Contactページにもリスト 3.40のコンテンツを表示してみましょう。)。
【解答】以下の通り。

### [test/controllers/static_pages_controller_test.rb]
require 'test_helper'

class StaticPagesControllerTest < ActionDispatch::IntegrationTest

  def setup
    @base_title = "Ruby on Rails Tutorial Sample App"
  end
  # contactのテストを作成
  test "should get contact" do
    get static_pages_contact_url
    assert_response :success
    assert_select "title", "Contact|#{@base_title}"
  end

end
<!-- ### [app/views/static_pages/contact.html.erb] -->
<% provide(:title, "Contact") %>
<h1>Contact</h1>
<p>
Contact the Ruby on Rails Tutorial about the sample app at the
<a href="https://railstutorial.jp/contact">contact page</a>.
</p>
### [app/controllers/static_pages_controller.rb]
class StaticPagesController < ApplicationController

  def contact
  end

end
### [config/routes.rb]
Rails.application.routes.draw do
  get 'static_pages/contact'

  get 'static_pages/home'
  get 'static_pages/help'
  get 'static_pages/about'
  root 'application#hello'
end

3.4.4 ルーティングの設定<演習>
1. リスト 3.41にrootルーティングを追加したことで、root_urlというRailsヘルパーが使えるようになりました (以前、static_pages_home_urlが使えるようになったときと同じです)。リスト 3.42のFILL_INと記された部分を置き換えて、rootルーティングのテストを書いてみてください。
【解答】以下の通り。

### [test/controllers/static_pages_controller_test.rb]
require 'test_helper'

class StaticPagesControllerTest < ActionDispatch::IntegrationTest

  def setup
    @base_title = "Ruby on Rails Tutorial Sample App"
  end
  # root_urlに置き換え
  test "should get root" do
    get root_url
    assert_response :success
    assert_select "title", "Contact|#{@base_title}"
  end

end

2. 実はリスト 3.41のコードを書いていたので、先ほどの課題のテストは既に green になっているはずです。このような場合、テストを変更する前から成功していたのか、変更した後に成功するようになったのか、判断が難しいです。リスト 3.41のコードがテスト結果に影響を与えていることを確認するため、リスト 3.43のようにrootルーティングをコメントアウトして見て、 red になるかどうか確かめてみましょう (なおRubyのコメント機能については4.2.1で説明します)。最後に、コメントアウトした箇所を元に戻し (すなわちリスト 3.41に戻し)、テストが green になることを確認してみましょう。
【解答】以下の通り。

### [config/routes.rb]
Rails.application.routes.draw do
  # 以下コメントアウト
  # root 'static_pages#home'
  get 'static_pages/contact'
  get 'static_pages/home'
  get 'static_pages/help'
  get 'static_pages/about'
end
### エラーになった事を確認
Error:
StaticPagesControllerTest#test_should_get_root:
NameError: undefined local variable or method `root_url' for #<StaticPagesControllerTest:0x00007f9717099b00>
    test/controllers/static_pages_controller_test.rb:34:in `block in <class:StaticPagesControllerTest>’
### [config/routes.rb]
Rails.application.routes.draw do
  # コメントアウトをはずす
  root 'static_pages#home'
  get 'static_pages/contact'
  get 'static_pages/home'
  get 'static_pages/help'
  get 'static_pages/about'
end
### 正常終了した事を確認
Finished in 0.402751s, 12.4146 runs/s, 24.8292 assertions/s.
5 runs, 10 assertions, 0 failures, 0 errors, 0 skips

【Ruby on Railsチュートリアル(第4版)】第2章 Toyアプリケーション(演習と解答)

はじめに

このブログ記事は、私(Kodak)自身のRailsの勉強記録として書いています。
Ruby on Railsチュートリアル』の演習と解答をもくもくと書いているだけの記事なので、興味の無い方は軽くスルーしてあげてください。他にも、まだ『Railsチュートリアル』の演習に挑戦していない方、これから『Railsチュートリアル』をやるぞ!という方は(演習の解答の)ネタバレになりますので、スルーしてください。

Ruby on Rails チュートリアルとは?

Ruby業界でRailsを使い始めるなら、まず最初に初めるRails入門サイトです。
電子書籍版は有料ですが、Webサイトにあるオンライン版は無料なので、誰でも読む(Railsにチャレンジする)事ができます。
railstutorial.jp
全部で14章あり、かなりのボリュームですが、これを読む事でRailsの基礎を学ぶ事ができ、ちょっとしたWebアプリケーションを作れるレベルにはなれる?とのこと。
各章毎に演習問題が複数あり、これを解いていく事でRailsへの理解を深めていく事ができる様になっています。

環境について

Ruby 2.5.0-dev
Rails 5.1.4
・バージョン管理ツール:GitHub(https://github.com/Kodak4400)

演習と解答

2.2.1 ユーザーページを探索する<演習>
1. CSSを知っている読者へ: 新しいユーザーを作成し、ブラウザのHTMLインスペクター機能を使って「User was successfully created.」の箇所を調べてみてください。ブラウザをリロードすると、その箇所はどうなるでしょうか?
【解答】消える。

2. emailを入力せず、名前だけを入力しようとした場合、どうなるでしょうか?
【解答】正常終了して、emailなしのユーザーが作成される。

3. 「@example.com」のような間違ったメールアドレスを入力して更新しようとした場合、どうなるでしょうか?
【解答】正常終了して、間違ったメールアドレスでユーザーが作成される。

4. 上記の演習で作成したユーザーを削除してみてください。ユーザーを削除したとき、Railsはどんなメッセージを表示するでしょうか?
【解答】「User was successfully destroyed.」と表示される。


2.2.2 MVCの挙動<演習>
1. 図 2.11を参考にしながら、/users/1/edit というURLにアクセスしたときの振る舞いについて図を書いてみてください。
【解答】以下の通り。
f:id:special-moucom:20180625014113p:plain

2. 図示した振る舞いを見ながら、Scaffoldで生成されたコードの中でデータベースからユーザー情報を取得しているコードを探してみてください。
【解答】以下の通り。
■users_controller.rb

    def set_user
      @user = User.find(params[:id])
    end

3. ユーザーの情報を編集するページのファイル名は何でしょうか?
【解答】users/edit.html.erb


2.3.1 マイクロポストを探検する<演習>
1. CSSを知っている読者へ: 新しいマイクロポストを作成し、ブラウザのHTMLインスペクター機能を使って「Micropost was successfully created.」の箇所を調べてみてください。ブラウザをリロードすると、その箇所はどうなるでしょうか?
【解答】消える。

2. マイクロポストの作成画面で、ContentもUserも空にして作成しようとするどうなるでしょうか?
【解答】作成される。

3. 141文字以上の文字列をContentに入力した状態で、マイクロポストを作成しようとするとどうなるでしょうか? (ヒント: WikipediaRubyの記事にある1段落目がちょうど150文字程度ですが、どうなりますか?)
【解答】作成される。

4. 上記の演習で作成したマイクロポストを削除してみましょう。
実機操作のため割愛。


2.3.2 マイクロポストをマイクロにする<演習>
1. ユーザーのshowページを編集し、ユーザーの最初のマイクロポストを表示してみましょう。同ファイル内の他のコードから文法を推測してみてください (コラム 1.1で紹介した技術の出番です)。うまく表示できたかどうか、/users/1 にアクセスして確認してみましょう。
実機操作のため割愛。

2. リスト 2.16は、マイクロポストのContentが存在しているかどうかを検証するバリデーションです。マイクロポストが空でないことを検証できているかどうか、実際に試してみましょう (図 2.16のようになっていると成功です)。
実機操作のため割愛。

3. リスト 2.17のFILL_INとなっている箇所を書き換えて、Userモデルのnameとemailが存在していることを検証してみてください (図 2.17)。
実機操作のため割愛。

【箱根湯本】月の宿 紗らでマタニティプランを満喫しました

今回は、久しぶりにブログらしいブログです。

はじめに

うちの嫁さんが子供を授かって約6ヵ月が過ぎようとした時に「最後の2人の旅行がしたい。」と言っていたので、旅行に行ってきました。妻のお腹の子も大きくなり、遠出は難しいと判断して、行き先は電車で片道1時間半圏内の「箱根湯本」にしました。

12:00頃 箱根湯本駅到着

f:id:special-moucom:20180610220439j:plain

ちょっと遅めに箱根湯本駅に到着です。
今回の旅は、妻の体に無理をさせない様、歩き回る観光ではなく、温泉に『しっぽり』と浸かって、日々の疲れを癒やそう。という事を目的としていました。
なので、朝も慌てる事無く、ゆっくりとロマンスカーに乗って箱根湯本駅に向かっていました。

12:30頃 昼食前

f:id:special-moucom:20180610220711j:plain

昼食を食べに『はつ花 そば』に向かう途中『焼きモンブラン』という看板が目に入りました。思わず寄り道して『焼きモンブラン』と『九頭竜餅』を購入。
昼食前ですが、美味しくいただきました。
『焼きモンブラン』は、モンブランが焼かれているのは勿論、中に栗が丸々1つ入っていて驚きました。『九頭竜餅』は、見た目は饅頭なのに、お餅のように生地が柔らかく、とても不思議な感じでした。もちろん両方ともとても美味しかったです。

13:00頃 昼食

f:id:special-moucom:20180610220731j:plain

以前から、箱根湯本に来たら1度は食べて見たかった『はつ花 そば』
というのも、私は「とろろ」が大好きで、その道の名店ともなれば是非とも行ってみたかったですよね。

あと、この時、初めて知ったのですが、私はずっと山芋という種類の芋があり、それを剃ったものが「とろろ」だと思っていたのですが、実は山芋とよばれる種類の芋は存在せず、自然薯、大和芋、長芋をまとめて山芋って呼とび、それらを剃ったものを纏めて「とろろ」と呼ぶらしいです。お恥ずかしながら1つ勉強になりました。

山芋・長芋・大和芋・自然薯の違いって?とろろ芋とはどれのこと? | 彩とりどりの世界

『はつ花 そば』のそば(貞女そば)は「とろろ」好きの人にはたまらない1品でした。 そばが「とろろ」に絡んでいるせいか、1口で食べるそばの量が多く、直ぐに食べ終えてしまったので、1品だけだとちょっと物足りない感じもしました。
しかし、まぁ腹八分目で考えるなら量は丁度良く、とても美味しく頂けました。

箱根湯本のお食事(昼食・ランチ・夕食・お土産)なら 自然薯蕎麦の、はつ花そば

14:00頃 ホテル 月の宿 紗らに到着

f:id:special-moucom:20180610220751j:plain

ホテルは、月の宿 紗らです。館内、部屋はとても綺麗で凄くお洒落でした。
(注:写真のベットがくしゃくしゃなのは、私が部屋に入って直ぐにベットにダイブしたからです。決して最初からくしゃくしゃだったワケではございません。)
今回はマタニティプランでの宿泊という事で、特に食事に対しては大変気を配って頂けました。
具体的には「食前酒」→「ジュース」、「生魚」→「湯葉」への変更やノンアルコールの飲み放題(もちろん旦那はアルコール飲み放題)等です。
また、これら料理についても従業員の方から丁寧に説明があり、大変満足しました。

最後に温泉ですが、大浴場と貸切風呂と2種類があり、貸切風呂については空いてさえすれば何時でも、何回でも入浴OKとの事でした。

いやぁ本当に幸せでした。豪華な食事に温泉。しかも綺麗な部屋で心も体も大満足でした。

www.hotespa.net

最後に

これにて「最後の2人の旅行」終了です。
次の旅行は何時になるやら・・・
そして、次の旅行の時には自分達の子供が居て、きっと大変なんだろうなぁ・・・と色々と考えさせられる旅行でもありました。