ruby on rails 学習メモ



新しくRuby on Railsを勉強し始めたのでメモ。
今まで学んだ言語(php, python, javascript)にはなかったものを中心に。

2017.6.1追記
[scivola](http://qiita.com/scivola)さんの大変勉強になるコメントを元に修正しました。
# ruby記法
## returnを省略可能
rubyではreturnを省略可能。最後の式が暗黙的にreturnになる

```ruby
def ok()
	"ok google" # return "ok google" と同意
end

ok # "ok google"
```

## メソッドの()を省略可能
rubyではメソッドの（）を省略可能。 ~~ただしそれはメソッドの定義で初期値を設定している場合のみ。例えば def(i=0,w="")など。これは引数がある場合でも同意~~

```ruby
def ok(w1 = "", w2 = "")
	"ok! #{w1} and #{w2}"
end

ok("one","two")
# ok! one and two
ok "one","two"
# ok! one and two
```

## 変数のスコープ
変数の文頭の記号によってスコープを設定している

####グローバル変数（$)
一番大きなスコープ。プログラム内で一意

```ruby
$global_v = 'hoge'

 def test
 	$global_v += 'fuga'
 end
 
 test # hogefuga
 
 puts $global_v # hogefuga 
```

####インスタンス変数（@)
インスタンの中で一意

```ruby
# クラスの定義
class Person
	def initialize(name)
		@name = name
	end
	def print_name
		puts @name
	end
end

# インスタンの作成
one = Person.new('hoge')
two = Person.new('fuga')

# 変数の確認
one.print_name # hoge
two.print_name # fuga 
```

####クラス変数（@@）
クラス内で一意。インスタンス変数との違いに注意。

```ruby
# クラスの定義
class Person
	def initialize(name)
		@@name = name
	end
	def print_name
		puts @@name
	end
end

# インスタンの作成
one = Person.new('hoge')
two = Person.new('fuga')

# 変数の確認
one.print_name # fuga
two.print_name # fuga
```

####ローカル変数
一番狭い。定義された関数の中でのみ有効。

```ruby

def test1
	test = 'hoge'
	puts test
end

def test2
	test = 'fuga'
	puts test
end

test1 # hoge
test2 # fuga
puts test # error
```

####
## 範囲
1..10のように書くことで1,2,3,4,5,6,7,8,9,10という範囲を定義できる。pythonのrange(1,10)と似ている。for文とか、配列の作成で使う。

```ruby
# forでの利用
for i in 1..10
	puts i
end

# 配列への展開で利用
(1..3).to_a # [1,2,3]

# オブジェクトを明示的に宣言
Range.new(1,3) == (1..3) # true

```



## 後続if
処理の後ろにifを書くことで、条件に一致した場合のみ処理を行うということができる

```ruby
x = 0

1 + 2 if x > 1 # nil
1 + 2 if x < 1 # 3
```

## 語尾に?がつくメソッドはBooleanを表す
empty?やinclude?などの ~~true,falseで値を返すメソッドについては？がついている。~~ 返り値の真／偽を伺うためのメソッド（返り値を条件式に用いるメソッド）に?が付いている。あくまで慣習。

```ruby
a = "test"
puts "a is empty" if a.empty? #nil

b = [3,4,5]
puts "include 5" if a.include?(5) # include 5
```



## unless構文
ifの逆で判定が偽の場合のみ処理を実行する。

```ruby
x = 0

unless x > 1 then
	puts "ok"
else
	puts "no"
end

# "ok"
```

## module
ヘルパー関数（独自関数？）をまとめるもの。module ApplicationHelperを指定するとrailsでは自動的に全てのviewで使える。

```ruby
module ApplicationHelper

	def test()
	
	//処理
	
	end
end
```

## 配列の処理

<<で ~~配列~~ 要素の追加。チェーンすることもできる

```ruby
a = [1,2]
a.push(3) # [1,2,3]
a << 4 << 5 # [1,2,3,4,5]
```

### 数値（文字）..数値（文字）で範囲を表す。
範囲は数値、又はアルファベットの範囲を表す。1..10なら1から10まで。アルファベットで"a".."z"のような記述も可能。

####数値を配列に変換。to_aメソッド

```ruby
a = 0..9
b = (a).to_a # [1,2,3,4,5,6,7,8,9]
```

####配列からカット

```ruby
a = [22,33,44,55,66]
a[2..4] # 44,55,66
```


## ブロック
~~よくわからん~~
{}で囲んで、||で変数を宣言。その後ろで処理。
doとendで囲んでもOK。 do endはrailsのtestのプログラムで使われてる

####例文）範囲の各要素に対して2をかけて、それを出力する

```ruby
# {}の時
(1..3).each{ |i| puts i * 2}
# do endの時
(1..3).each do |i|
	puts i * 2
end

# 2
# 4
# 6

```

####例文）配列の各要素を自乗する。mapメソッド

```ruby
a = [1,2,3]
a.map{ |i| i**2}
# [1,4,9]
``` 

####例文）省略記法
変数を単体で使う場合は&:を使って省略して記入できる。
ただし、その場合は{}ではなくふつうの関数と同じく()になるので注意。

```ruby
a = [1.2,2.3,3.3]
a.map(&:ceil)
# [2,3,4]
# a.map{ |i| i.ceil }と同意
```


## %記法
"や'の代わりに使用できる。"と'をエスケープする必要がない。%, %w, %Wやらいろいろ種類がある。後ろの記号()はなんでもよし。
[ここ](http://qiita.com/mogulla3/items/46bb876391be07921743)がわかりやすい

```ruby
x = ryo
# 文字列 変数展開
a = %(#{x} is best friend) 
# ryo is best friend
	
# 配列へ格納 式の展開なし
b = %w(ryo kei tuka)
# [ryo, kei, tuka]

```

## ハッシュ（連想配列）
連想配列のことをハッシュという。 ~~配列と違って並び順は固定ではない。~~ ruby1.9からは並び順も固定。
リテラル記法では=>を使って要素を宣言できる。
{}を使うがブロックとは異なるので注意。

```ruby
# 空の配列
user = {}

# 要素の定義
user["one"] = "ryo" # { "one" => "ryo"}

# 要素の定義（リテラル記法）
user = { "one" => "ryo", "two" => "yu"}
```

ハッシュでもeachメソッドとブロックが利用可能。ハッシュの場合は変数を2つ持つ

```ruby
a = { one:"hello", two:"goodby" }
a.each do |key,value|
	%(#{key}と#{value})
end

# oneとhello
# twoとgoodby
```


## シンボル
ハッシュのキーで使われることが多いらしい。:を文頭につける
数字で始まったり空白文字を含むシンボル名の場合は""で囲む



```ruby
# ハッシュで利用
a = { :one => "ryo", :two => "you" }

# railsでハッシュのキーとしてシンボルを使う場合以下のような省略記法を使う。
b = { one:"ryo", two:"you" }

# a == b


# 空白文字を含むシンボル
:"test test"
# 数字で始まるシンボル
:"1d"
```

## stylesheet_link_tag の解説

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

これを解くには
- メソッドの()は省略可能
- 引数の最後がハッシュの場合は{}が省略可能
- 引数の途中で改行可能
というのを知る必要がある。

上を省略せず書くと

```ruby
<%= stylesheet_link_tag('application', {media: 'all', 'data-turbolinks-track': 'reload'} %>
```

となる。第一引数でstylesheetoのパスを送り、ハッシュでメディアタイプとturbolink?を送っている。
~~なぜこんな分かりづらい記法なのだろう。。~~
改行が適切だと({でネストするより分かりやすい。

実行すると以下になる

```ruby
<link data-turbolinks-track="true" href="/assets/application.css" media="all"
rel="stylesheet" />
```

## classの継承
class hoge < foo の < でhogeクラスがfooクラスを継承していることを表す

```ruby
# fooクラスの定義
class Foo
	def ok
		puts "ok"
	end
end

# fooクラスを継承したhogeクラスの定義
class Hoge < Foo
	def bad
		puts "bad" 
	end
end

# インスタンスの作成
test = Hoge.new

# 実行
test.ok # ok
test.bad # bad
```

## 組み込みクラスの拡張が可能
rubyではたとえ組み込みのクラスでも拡張が可能。

## アクセリー
勉強中、getterとかsetterとかまだ理解できてない。

# Railsの記法
## aタグを生成(link_to)
```ruby
<%= link_to "Home", "./hoge", id:"test" %>

# 生成されるタグ
# <a href="./hoge" id="test">Home</a>
```

## imageタグの生成(link_to image_tag)
```ruby
<%= link_to image_tag("rails.png", alt: "Rails logo"),
            'http://rubyonrails.org/' %>
            
# 生成されるタグ
# <img alt="Rails logo" src="/assets/rails-9308b8f92fea4c19a3a0d8385b494526.png" />
# src末尾の連番はrailsが自動的に付与する
```

## パーシャル
htmlのレイアウトを分割することができる。パーシャルのファイルはファイル名の頭に'_'をつける。

レイアウト

'''layout/_test.html.erb
<p> パーシャルです </p>
```

パーシャルの読み込み

```layout/application.html.erb
.
.
<%= render 'layout/test' %>
.
.
```

## アセットパイプライン
railsがassetsをまとめてくれる。読み込み時間の短縮。scssとかcoffeescriptとかの自動コンパイルも。
なんて便利なんだ。

## 名前付きルート
routeで指定したページのurlをhoge_path、hoge_urlなどのように