Railsを使っている際に知ったRuby備忘録



##Rails関連の備忘録
http://qiita.com/jun910/items/74dd71debc1edf566111

##Railsを使っている際に知ったRuby備忘録

###`||=`の意味(使う)
自己代入→`a ||= 1 ` a が偽か未定義ならば1を代入。初期化時のイディオムの一種。


###クラス内でのself.の扱い方(特異メソッド)
参考サイト：http://rails.hatenadiary.jp/entry/2013/02/15/125047
今回は、sessionを用いたログイン実装で利用

```rb
def user.correct_password?(******)
```

で設定したものを別のクラスで

```rb
def correct_password?(input_password)
  self.password == input_password.to_s
end
```

として、selfで　元のクラスにあった、userをそのまま持って来れる(今回では、配列が入ったオブジェクトとしてuserを定義し、selfで持ってきた)

この場合はselfは疑似変数と呼ばれる

クラス内でのインスタンスメソッドの動きについては、こちらが分かりやすい
http://blog.livedoor.jp/sasata299/archives/51302623.html
selfがどのように、利用されているかが実行結果で分かる
※ちなみにjavaではthisというらしい
http://ja.wikipedia.org/wiki/This_%28%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%29

###特異メソッドについて(参考サイト)
さらに、クラスメソッドとインスタンスメソッドについては、こちらでも
http://nigohiroki.hatenablog.com/entry/2014/03/12/010344
> クラスメソッドの場合
> 
> - Dogのうち一番年齢の高いDogを取り出すメソッド
> - Dogのうちオスのみを取り出すメソッド
> 
> 例えばこんな感じ
> 
> ```rb
> class Dog < ActiveRecord::Base
>     # 一番年齢の高いDog
>     def self.get_oldest
>         self.order("age DESC").limit(1)
>     end
>     # オスのみを取り出す
>     def self.get_male
>         self.where(:sex => "male")
>     end
> end 
> ```
**要は「クラス全体の中から何かを取り出す」場合などに利用されます。**

###インスタンスメソッドの場合
とあるDogの年齢、性別をHashで取り出すメソッド
とあるDogの親のDogを取り出すメソッド(親が子のIDを持っているケース)

```rb
class Dog < ActiveRecord::Base
    # 年齢、性別
    def get_profile
        { :age => self.age, :sex => self.sex } 
    end
    # 親を取り出す
    def get_parent
        Dog.where(:child => self.id)
    end
end
```
こちらは「あるインスタンスの何かを取り出す」場合などに利用されます。インスタンスメソッドの場合は更新系もよく出てくるかと思います。

###class << self(特異クラス)について
参考サイト：http://magazine.rubyist.net/?0046-SingletonClassForBeginners
> ```rb
> class Bar
>   def hello
>     puts 'hello'
>   end
>   class << self
>     def bye
>       puts 'good bye'
>     end
>   end
> end
> 
> Bar.new.hello #=> hello
> Bar.bye       #=> good bye
> ```

つまり、特異クラスについては、イニシャライズ(new)しなくていい、そのままメソッドが使える

###present?でnilでないかどうかの判定
参考サイト：http://techracho.bpsinc.jp/baba/2011_11_26/4724
なるべく、否定である`!`は書かないようにとのこと

###メソッドの最後に!や?をつけるのは？？？
そのメソッドが判定を行ったり、何かやっていない状態での動作などを表すため
ex.
ログインをして'いない'状態でログインを求めるメソッド名

```rb
def require_login!
```

パスワードが一致しているかどうかを判定して、ture or false を返したい場合

```rb
def correct_password?
```

###インスタンス変数とローカル変数のスコープの違い
ローカル変数よりインスタンス変数の方がスコープの範囲が長い
参照サイト：http://docs.ruby-lang.org/ja/2.0.0/doc/spec=2fvariables.html
> ローカル変数のスコープは、((*宣言した位置から*))その変数が宣 言されたブロック、メソッド定義、またはクラス/モジュール定義 の終りまでです。寿命もそのブロックの終りまで(トップレベルの ローカル変数はプログラムの終了まで)ですが、例外としてブロッ クが手続きオブジェクト化された場合は、そのオブジェクトが消滅 するまで存在します。同じスコープを参照する手続きオブジェクト 間ではローカル変数は共有されます。 


###いまさらながら、ruby の　putsでつまずいた部分
`puts`
 のについては、あらかじめ型の宣言がされていないのでstringとintegerは同居できないのでそのなかで型宣言(to_s)とかをやってあげないといけない
to_i.to_sで端数の切り捨てもできる

###別クラスからメソッドを利用したいとき
クラス名.メソッド名(引数) 
→引数はある場合のみ
※ただし、イニシャライズが必要な場合はイニシャライズしておくこと

ex.

```rb:client_user_logins_controller.rb
class ClientUserLoginsController
SentMail.reset_password_to_mail(user)
end
```
###superメソッドって?
クラスの継承を行った際に継承元と同じメソッド名の処理を引っ張ってこれるメソッドのこと

>```rb:
>class Car
>  def accele
>    print("アクセルを踏みました¥n")
>  end
>end

>class Soarer < Car
>  def accele
>    super
>    print("加速しました¥n")
>  end
>end
>
>```

これで、Soarerクラスのacceleメソッドを実行するとCarクラスのacceleメソッドで定義している処理も実行できる

参考url: http://www.rubylife.jp/ini/inherit/index3.html

###include?メソッドについて
include?メソッドはarrayクラスとstringクラスにはあるメソッドだが、integerにはないので、単一の数字を含んでいるかどうかの確認は == を用いて確認

###parseとは？
jsonなどで取得した結果を見てみると分かるが、parseすることでkeyとvalueに分けてくれる
例えば、

```rb:
member = Member.first.to_json
 #=> "{\"id\":1,\"email\":\"reda.dsajpsa@gmail.com\",\"name\":\"ユーザー\",\"image_file_name\":null,\"image_content_type\":null,\"image_file_size\":null,\"image_updated_at\":null,\"kana\":null,\"password\":null,\"entry_year\":null,\"chatwork_id\":\"\",\"birthday\":null,\"indoor_call\":null,\"profile_message\":null,\"hobby\":null,\"job\":null,\"main_department_id\":null,\"created_at\":\"2015-08-05T14:13:35.000Z\",\"updated_at\":\"2015-08-08T07:49:06.000Z\",\"provider\":null,\"uid\":null,\"token\":null}"

```
この結果をparseすると

```rb:
hash = JSON.parse(member)
 #=> 
{"id"=>1,
 "email"=>"reda.dsajpsa@gmail.com",
 "name"=>"ユーザー",
 "image_file_name"=>nil,
 "image_content_type"=>nil,
 "image_file_size"=>nil,
 "image_updated_at"=>nil,
 "kana"=>nil,
 "password"=>nil,
 "entry_year"=>nil,
 "chatwork_id"=>"",
 "birthday"=>nil,
 "indoor_call"=>nil,
 "profile_message"=>nil,
 "hobby"=>nil,
 "job"=>nil,
 "main_department_id"=>nil,
 "created_at"=>"2015-08-05T14:13:35.000Z",
 "updated_at"=>"2015-08-08T07:49:06.000Z",
 "provider"=>nil,
 "uid"=>nil,
 "token"=>nil}

```
という形で直してくれる


###文字列を用いてメソッドを呼び出したいとき
sendを使う

```rb:
member.name
 #=> 'sample'
member.send('name')
 #=> 'sample'
```