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

# 関連記事

* [書籍『Ruby on Rails 5 超入門』つまずきやすいポイントまとめ【Chapter1】](http://qiita.com/laineek/items/50282a1d152098f42e15)
* [書籍『Ruby on Rails 5 超入門』つまずきやすいポイントまとめ【Chapter2】](http://qiita.com/laineek/items/121a9a20d5eb26fb56f4)
* [書籍『Ruby on Rails 5 超入門』つまずきやすいポイントまとめ【Chapter3】](http://qiita.com/laineek/items/86d392541e3278dd95d3)
* 書籍『Ruby on Rails 5 超入門』つまずきやすいポイントまとめ【Chapter4】　★今ここ
* 書籍『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.159] データ検索でのLIMITとOFFSETの併用

下記サンプルソース(リスト4-15)は、順次処理（副問合せのような動作）をするのかな？と迷いましたが、それは間違いでした。

```ruby
@people = Person.all.limit(2).offset(3)
```

誤った予想：

1. 2行を検索する。（limit）
2. 検索結果に対して、3行目以降のみ絞り込む。(offset)


正しくは**1つのクエリを構築するための記述**でした。そのため、limitとoffsetを入れ替えても全く同じSQLが発行され、同じ動作をします。

```ruby
@people = Person.all.limit(2).offset(3)
#=> SELECT  "people".* FROM "people" LIMIT 2 OFFSET 3 
```
```ruby
@people = Person.all.offset(3).limit(2)
#=> SELECT  "people".* FROM "people" LIMIT 2 OFFSET 3 
```

実際の動作（入れ替えても一緒）：

1. 3行目以降のみ対象(offset)とし、2行検索する(limit)。

正確には、Ruby on Rails 側はSQLを作っているだけにすぎないので、処理自体はDBに依存します。詳しくは、SQLiteのLIMIT/OFFSETについて調べましょう。

また、今回はSQLiteを使っておりLIMIT/OFFSETに対応できましたが、他のDBの場合はどのように記述するのか？は別の機会に勉強したいですね。

## [p.274] messages.scssの作成も忘れずに

ソースばかり並ぶ章なので見逃しやすいですが、本文中にmessages.scssの作成が指示されています。スクリーンショットとあわせるなら、**people.scssの丸コピー**をしてください。(文中にあるcardsは背景グレーのものなのでかなり見づらいです。）

## [p.288] has\_one と belongs\_to の使い分け

ちょっと分かりづらかったの自分なりに整理・・・

* **has_one** は、主となるモデルに記述する。
* **belongs_to** は、参照しているモデルに記述する。（外部キーをもっている方と解釈すると分かりやすい。）

※　現実的には、多対多になるケース（設計がどうなのという議論は置いといて）等、世の中には様々なケースがあるので、Ruby on Rails で前提とする設計セオリー＆どこまで対応可能かは別途掘り下げて整理しておきたいです。

## [p.327] リスト4-64

サポートページのソース一式に含まれていません。手入力だとかなり非効率なので置いておきます。

```ruby
  get 'blogs/index'
  get 'blogs', to: 'blogs#index'
  get 'blogs/:page', to: 'blogs#index'

  get 'blogs/genre/:id', to: 'blogs#genre'
  get 'blogs/genre/:id/:page', to: 'blogs#genre'

  get 'blogs/show/:id', to: 'blogs#show'

  get 'blogposts/index'
  get 'blogposts', to: 'blogposts#index'

  get 'blogposts/delete/:id', to: 'blogposts#delete'
  post 'blogposts/delete', to: 'blogposts#delete'
  post 'blogposts/delete/:id', to: 'blogposts#delete'

  get 'blogposts/add'
  post 'blogposts/add'

  get 'blogposts/:id', to: 'blogposts#edit'
  patch 'blogposts/:id', to: 'blogposts#edit'

  get 'blogposts/delete'

  get 'bloggenres/index'
  get 'bloggenres', to: 'bloggenres#index'

  get 'bloggenres/add'
  post 'bloggenres/add'

  get 'bloggenres/:id', to: 'bloggenres#edit'
  patch 'bloggenres/:id', to: 'bloggenres#edit'

  get 'blogconfigs/index'
  get 'blogconfigs', to: 'blogconfigs#index'

  get 'blogconfigs/edit'
  patch 'blogconfigs/edit'
```


# 誤植

一部ソースレビューのような内容も含みます。

## [p.226] リスト4-4

* 誤） tr閉じタグが重複している。

``` html
<table>
	<%= form_tag(controller: "people", action: "find") do %>
	<tr><th>FIND</th>
		<td><%= text_field_tag("find") %></td></tr>
	<tr><th></th>
		<td><%= submit_tag("Click") %></td></tr>
	</tr>
	<% end %>
</table>
```
 
* 正） tr閉じタグを除去する。

``` html
<table>
	<%= form_tag(controller: "people", action: "find") do %>
	<tr><th>FIND</th>
		<td><%= text_field_tag("find") %></td></tr>
	<tr><th></th>
		<td><%= submit_tag("Click") %></td></tr>
	<% end %>
</table>
```

※下記を基にしたと思われる **4-3章のソースも同様の複数箇所で重複しています。**


## [p.242] リスト4-14

* 誤） 使用していない変数fが存在する。

```ruby
    if request.post? then
      f = params[:find].split(',')
      @people = Person.where('name like ?', '%' + params[:find] + '%').order 'age asc'
    end
```

* 誤） 使用していない変数fを除去する。

```ruby
    if request.post? then
      @people = Person.where('name like ?', '%' + params[:find] + '%').order 'age asc'
    end
```

# 今後

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