書籍『Ruby on Rails 5 超入門』つまずきやすいポイントまとめ【Chapter2】

# 関連記事

* [書籍『Ruby on Rails 5 超入門』つまずきやすいポイントまとめ【Chapter1】](http://qiita.com/laineek/items/50282a1d152098f42e15)
* 書籍『Ruby on Rails 5 超入門』つまずきやすいポイントまとめ【Chapter2】　★今ここ
* [書籍『Ruby on Rails 5 超入門』つまずきやすいポイントまとめ【Chapter3】](http://qiita.com/laineek/items/86d392541e3278dd95d3)
* [書籍『Ruby on Rails 5 超入門』つまずきやすいポイントまとめ【Chapter4】](http://qiita.com/laineek/items/408dc12e2c5f8c86d48c)
* 書籍『Ruby on Rails 5 超入門』つまずきやすいポイントまとめ【Chapter5】
    * 特にありませんでしたので、作成していません。
* [書籍『Ruby on Rails 5 超入門』つまずきやすいポイントまとめ【Chapter6 最終回
】](http://qiita.com/drafts/871a0b93b4cbd82c8e2a)


# 私の環境

* Windows 10 Home 64bit
* Ruby 2.2.6
* Rails 5.0.2

# つまずきやすいポイント

## [p.84] stylesheet\_link\_tagでエラーが発生した場合の対処法

私の環境では、SassをつかってHeloコントローラ用のスタイルを作成し、いざ表示！というところでエラーが発生しました。

```
ExecJS::ProgramError in Helo#index
```

```
ActionView::Template::Error (TypeError: オブジェクトでサポートされていないプロパティまたはメソッドです。):
    4:     <title>RailsApp</title>
    5:     <%= csrf_meta_tags %>
    6:
    7:     <%= stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track': 'reload' %>
    8:     <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>
    9:   </head>
   10:
```

原因・対処法については、[書籍のサポートページ](http://www.shuwasystem.co.jp/support/7980html/4832.html)にある「Section 2-3のExecJS::ProgramErrorについて（PDF）」に掲載されていますのでそちらを参照してください。ただし、**手順通り実行すると誤りやすい**ので一部補足します。

上記PDFでは、２つの手順が紹介されています。

1. 「/app/views/layouts/application.html.erb」の'applications'を'defaults'に書き換える。
2. 手順1でも解決しない場合は「CoffeeScript 1.8.0」を指定する。

実際に、手順1を実行しても解決しない場合に、そのまま手順2と実行を進めると、ページは表示されるようになるものの、「defaults.css」「defaults.js」という存在しないファイル（404）を参照しようとします。その結果、**文字色等の装飾が反映されない状態となってしまいます**。

正しくは、手順2まで実行しなければいけない場合には、**手順1で変更したものを戻す（'defaults'->'applications'への書き直し）作業が必要です。**これにより、正しく装飾が反映された状態となります。

## [p.93] 「request.post?」メソッド末尾のクエスチョンマーク（疑問符）の正体

メソッド名の一部とのこと。初めて見ましたが、ほかの言語だと「is_xxx」等のメソッド名で管理しているところを、Rubyではこのような命名もできるのですね。

> def xx?
> この場合の「?」はメソッド名の一部分です。 慣用的に、真偽値を返すタイプのメソッドを示すために使われます。


参考: [Rubyで使われる記号の意味（正規表現の複雑な記号は除く） (Ruby 1.8.7)](https://docs.ruby-lang.org/ja/1.8.7/doc/symref.html)


## [p.124] ミニ伝言板のソースは、書籍のサポートページから入手可能

HTMLやスタイルシート等について、全て手打ちする時間がとれない場合は、[書籍のサポートページ](http://www.shuwasystem.co.jp/support/7980html/4832.html)にある「一括ダウンロード」から**サンプルソースをダウンロードできます**。理解できていると思うところは、コピペして時間を節約しましょう。

というか、全て手打ちだと、細かい間違いに、気づきづらい（＝詰まりやすい）行数なのでコピペしたほうが個人的には良いかと思います。

## [p.135] 実行後のデータの保存先

書籍どおりに作業されているならば**「Desktop\RailsApp\data.txt」**に保存されています。

# Controllerでしていることコメント解説

自分の勉強をかねてControllerにコメントを追記してみました。ソースを読んでも何をしているのかよく分からない方は参考にしていただけましたら幸いです。（ざっくり書かれている、p.139「JSON型式データとRubyオブジェクト」のコラムの意味もちょっとは理解しやすくなるはずです。）

```Ruby
class DengonbanController < ApplicationController
	layout 'dengonban'


	def initialize
		super

		begin
			# data.txtに登録されている伝言情報一式を取得し、メモリ上の@dengon_dataに代入します。
			@dengon_data = JSON.parse(File.read("data.txt"))
		rescue
			# 取得できない場合は、空のHashを作成しておきます。
			@dengon_data = Hash.new
		end

		# メモリ上の@dengon_dataから24時間を過ぎた伝言は削除します。
		# 後半の登録処理（indexメソッド内）において、
		# 時間をキーとして書き込まれているので、そのままキーは時間で復元されています。
		# （この時点では元のテキストデータからは削除されません。）
		@dengon_data.each do |key,obj|
			if Time.now.to_i - key.to_i > 24*60*60 then
				@dengon_data.delete(key)
			end
		end

		# メモリ上の@dengon_data(古い伝言削除済み)を、data.txtに新たに上書きます。
		# （ここでようやく元のテキストデータからも削除されます。）
		File.write("data.txt", @dengon_data.to_json)
	end


	def index

	    # ###################################################
    	# initializeが冒頭で実行されます。(7章Ruby超入門を復習) 
    	# ###################################################

		if request.post? then

			# フォームから送信された値を使って、MyDataオブジェクト（伝言１件）を生成します。
			obj = MyData.new(msg:params['msg'], name:params['name'], mail:params['mail'])
			  
			# 時間をキーにして、オブジェクトを追加します。
			# （@dengon_dataには、initializeメソッドで取得した過去の伝言が含まれています。）
			newkey = Time.now.to_i
			@dengon_data[newkey] = obj
				
			# ==================================================
			# この時点で、@dengon_dataはクラスが混合して代入されている。
			# 登録済みのKeyはHash型、今回追加されたKeyにはMyClass型となっている。
			# p.139 のコラム参照。
			# 例：
			#   @dengon_data[oldkey1]['msg']
			#   @dengon_data[oldkey2]['msg']
			#   ...
			#   @dengon_data[newkey].msg
			# ==================================================
				
			# JSONテキストに変換してファイルに伝言一式（新しいものを含む）を書き込みます。
			data = @dengon_data.to_json
				File.write("data.txt", data)
				
			# JSONテキストになった伝言一式をHash型に一括変換されます。
				@dengon_data = JSON.parse(data)
				
			# ==================================================
			# この時点でようやく@dengon_dataはクラスはHash型に統一される。
			# 例：
			#   @dengon_data[oldkey1]['msg']
			#   @dengon_data[oldkey2]['msg']
			#   ...
			#   @dengon_data[newkey]['msg']
			# ==================================================

		end
	end
end
```

# 誤植

### [p.121] ページ末尾のリストのファイル名

* 誤） [リスト2-34] helofooter.html.erb 
* 正） [リスト2-34] helo_footer.html.erb



# 今後

引き続き、詰まりやすそうかなあというポイントがあればまた投稿します。