【初心者過ぎて聞くのが恥ずかしい事は】僕の知りたかったrailsとgemのtipsまとめ【全部Googleが教えてくれた】


#概要

[Perfect Ruby on Rails](http://www.amazon.co.jp/%E3%83%91%E3%83%BC%E3%83%95%E3%82%A7%E3%82%AF%E3%83%88-Ruby-Rails-%E3%81%99%E3%81%8C%E3%82%8F%E3%82%89-%E3%81%BE%E3%81%95%E3%81%AE%E3%82%8A/dp/4774165166)を読んで基本的なことはそれとなく知っている初心者（つまり、僕）というターゲットで記事書いてます。

【参考になる人】

- とりあえず、便利そうなの入れてみたけど英語読むのだるい。
- こんなことで人に聞くのはちょっとなぁ。
- これ知っとけば検索に使える！

【参考にならない人】

- Rubyなんて片手間で遊ぶものよ
- (　´,_ゝ｀)ｸｯｸｯｸ･･･(　´∀｀)ﾌﾊﾊﾊﾊ･･･(　 ﾟ∀ﾟ)ﾊｧｰﾊｯﾊｯﾊｯﾊ!!

いつものことながら僕のための備忘録ですが、頑張って分かりやすいように纏めるよ！

正しくない解釈（動きから察するに、こういうものでしょ？　見たいな）が沢山あると思いますが
都度皆さんで上手く咀嚼して下さい。

※随時更新していくかもしれません。

# Ruby編

##PHPとの違い
根本的な違いを知りたい方は他所へGO！
僕が感じた超表面上のことだけ言うなら

- セミコロンが要らない
- def end　でメソッドぽいのが書ける
- 特にリターンとか書かなくても最終行が返り値になるっぽい
- 「if elsif end」if分がちょっといつもと違って変（ぇ
- etc...

うぅ、ruby怖い、ruby怖い。
でも慣れるともうセミコロンなんて打ちたくないお（＾ω＾）
ってなるので、きっと怖くないです。

## '||=' とか　'&&=' ってなに？（自己代入）

PHPやっているときは一度も見なかったのですが...
自己代入という仕組みがRubyにはあるようです。（PHPにもあったら御免なさい）

[論理演算子の自己代入について、ほとんどのRubyテキストで誤った説明をしている](http://d.hatena.ne.jp/riocampos+tech/20130611/p2)

このサイト様が詳しく説明しているかと思います。

：【追記】：

[『a ||= b』は『a = a || b』ではなく『a || a = b』とほぼ同じ意味、と覚えましょう - わからん](http://d.hatena.ne.jp/kitokitoki/touch/20111022/p4)

により詳しく説明が乗っているようです！
riocampos様紹介有難うございます！

# Rails編

なんかよくわかんないメソッドがあったら

[Railsドキュメント](http://railsdoc.com/)
此処から探すと並大抵のことは解決すると思いますが、その中でも僕が
これは覚えておくと楽だなぁというのを抜粋します。

##コマンド

ファイルのジェネレートとか。
この方の記事が参考になります。
[いつも忘れる「Railsのgenerateコマンド」の備忘録](http://maeharin.hatenablog.com/entry/20130212/rails_generate)

でも基本的に

```shell
$ rails g scaffold
$ rails g generate controller NAME
```

これだけ覚えておけば作り始めは困らないと思う。
必要に応じて覚える量増やしていけば、困ったときに調べれば済むことなので
やり始めは暗記しなきゃ！と意気込む部分でも無いです。

##view

特に書くこともないです。
ほかのサイトさん調べればいっぱい出てくる箇所だと思います。

phpで吐き出すときは

```php
<?php echo 'phpだお'; ?>
<?= $php_dao; ?>
```

こうなのが
rubyだと


```erb
<% 'rubyだお' %>
<%= @ruby_dao %>
```

これくらいの違いですかね。

##controller

cakePHPとかやっていれば、大体何をする部分かわかると思いますが、
とりあえず抑えておいたほうがいいなぁと思うのを紹介します。

### render

cakePHPでも有りますね。
何つかって描画しよう？ってやつです。

```ruby
render :template = コントローラ名/アクション名, :layout => レイアウト名
```

だいたいこんな感じで使われるのかなと思います。
URLとコントローラーに書いてあること一致しないぞぉ！？
と思ったら大体renderさんが何かしているorルーティングの設定
が原因（？）なので疑ってみましょう！

### before_action

controller内でメソッドを定義した後、

```ruby
class testController < ApplicationController
	before_action :check_login!
```

みたいに書くことで先にcheck_login!として定義したメソッドを先に動かすことが出来ます！
もしログインしてなかったらリダイレクトするというような処理を
全体で先んじてやりたい！
なんてときに非常に便利です。もし、一部のアクションでだけそうさせたいときは

```ruby
before_action :check_login!, only: [:home]
```

なんて書くと良いです。

### private と protectedとか

Java（というかオブジェクト指向言語）を使っていると見覚えがあると思いますが、

ruby on railsだと

>    public => public に設定されたメソッドは制限なしに呼び出せます。
    protected => protected に設定されたメソッドは、そのメソッドを持つオブジェクトが self であるコンテキスト(メソッド定義式や instance_eval )でのみ呼び出せ ます。
    private => private に設定されたメソッドは関数形式でしか呼び出せません。

と言うものらしいです。[参照：Ruby 2.1.0 リファレンスマニュアル > クラス／メソッドの定義 ](http://docs.ruby-lang.org/ja/2.1.0/doc/spec=2fdef.html#limit)

このメソッドはこのコントローラーでしか使いません！（private)など明示的にしたり、使える幅を限定的にしたり便利で、使い方は多そうです。（まだ使いこなせてない）

この方の記事が参考になると重いますので、詳しくはｺﾁﾗ！
[Ruby | Ruby の private と protected 。歴史と使い分け](http://qiita.com/tbpgr/items/6f1c0c7b77218f74c63e)

###スタックトレースとerror catch的な奴。

[参考　■ もっと簡単にデバッグ用にメソッドの呼び出し元（スタックトレース）をログに出力する方法　@まちゅダイアリー](http://www.machu.jp/diary/20091019.html#p01)

javaとかでいうerror catchは
ruby on rails だと begin resuce に該当します。

これでガンガンバグをキャッチしてログに残せるぜ！

って時でも、コンソールで叩いてる時に、何が起こってるかエラー全文みたいなぁというと気には
スタックトレースしましょう。
詳しくは参考をどうぞ！

```ruby
  #例外オブジェクト
  begin
    raise Exception.new
  rescue Exception => e
    STDERR.puts e.backtrace.join(", ")
  end
  
  #caller
  def some_method
    STDERR.puts caller.join(", ")
  end
```

###日付データのフォーマットってどうするの。

+0900ってなんだよ消したい！

そんなあなたに。

[日付データをフォーマット(strftime) @Railsドキュメント](http://railsdoc.com/references/strftime)

```ruby
@time = Time.strftime("%Y-%m-%d %H:%M:%S")
#=>2000:01:01 11:11:11
```

こんな感じに表示できますよ！

##model

[Railsのモデルの作成、検索、更新、削除のよく使うメソッドのまとめ](http://ruby-rails.hatenadiary.com/entry/20140724/1406142120)

簡単な操作はここによくまとめられております。
非常に助かります＞＜

###結合というかリレーションがよくわかんねぇ（Active Record の関連付け (アソシエーション)）

railsで最初に３大苦労するポイントがリレーションです。（一つはセットアップ、もう一つがコロコロ変わるmigrateの対応だと思う。）

これを知らずにモデル設計しようものなら（面倒なことになって）死んでしまいます。

まずは此方を確認してからモデルに挑みましょう。
[Active Record の関連付け (アソシエーション)](http://railsguides.jp/association_basics.html)

わかります？
僕はちょっと噛み砕くのに時間がかかりました。
僕なりに纏めると、

customer（顧客テーブル）がorder（注文テーブル）したデータを保存しておくという関係だと
orderが「誰が注文しました」という情報を保持しておかないといけません。（customer_id）

という時に、

customerはhas_many :orders（顧客データに複数の注文情報）
orderはbelongs_to :customer（一つの注文に一つの顧客情報）

というような関係になるわけです。

テーブルが３つになっても解釈の方法は同じ感じで

[抜粋箇所](http://railsguides.jp/association_basics.html#has_many-:through%E9%96%A2%E9%80%A3%E4%BB%98%E3%81%91)

患者　Physician
予約　Appointment
医者　Patient

なら、
1人の医者が複数の患者を見ます。
1人の患者は複数の医者に見られます。
診察予約はどの医者と、どの患者が出会ったのか記録しています（Physician.idとPatient.id)

という関係であることから、


```ruby
class Physician < ActiveRecord::Base
  has_many :appointments
  has_many :patients, through: :appointments
end
 
class Appointment < ActiveRecord::Base
  belongs_to :physician
  belongs_to :patient
end
 
class Patient < ActiveRecord::Base
  has_many :appointments
  has_many :physicians, through: :appointments
end
```

このような設定にすればいいんだなと理解できると思います。
throughというのは、throughで設定したテーブルを通して、has_manyなデータを取得するという意味です。
このような設定をすることで、

1人の医者がみた患者のデータ。

> Patient.find(id). physicians

1人の患者を診察した医者のデータ。

> Physician.find(id).patients

というようなデータが取ってこれるようになるわけですね。


この辺は慣れですので頑張りましょう！

#### モデルのいんすたんすなんだけど？

インスタンスといえば「＠」これを付けるあれですね。

```ruby
@model_data = Model.find(1)

@model_data.id
#=> 1
```

とかでmodelsテーブルからidが１のデータをmodel_dataに入れることが出来ます。
勿論find(1)でやったんでmodel_data.idは１です。

って出来るじゃないですか。

```ruby
model_data = Model.where('model_flag = ? ', true);

p model_data.id
#=> error
```

こんな感じでやると、怒られます。
それデータが複数だから怒られるんじゃない？
と思われるかもしれませんが、仮にとれたデータが一つだとしても怒られます。
一個だから出来てもいいじゃん！なんでfindじゃないと駄目なの？

と思って調べたのですが

find :オブジェクト一個返すよ。 
where :配列でオブジェクト返すよ。

ということらしく、配列になっているみたいですね。

ならwhereでやった後とかなら

```ruby
model_data.each do |data|
	p data.id
end

model_data.first
p model_data

#=> 該当するid
```

と、することで確実にオブジェクトとして取り出すことで
ようやっとやりたい事ができるようになるわけですね。


# Gem編

僕が使ったGemを紹介します。

##Grape
APIが簡単に出来て良いね！
という奴。

参考：
1.[Grape + Railsで、Jbuilderを使ったJSONフォーマットAPIを作る](http://qiita.com/zaru/items/fa64a4e00b76ea6ce36f)


###使い方

```ruby
gem 'grape'
```
1, Gemfileに記述して、bundle installしましょう！

2, apiを置く場所を決めましょう。

> app/api 以下にapiを作ったと仮定しまして。

3, 自動読み込み対象に登録。

4, ルーティングを決める。

5, 後はgrapeの説明通りにやればOK！

###じどうよみこみ？

rails sした時にappの中身を読み込んで、表示とか色々やるんですけど、apiとフォルダを新しく作るとrailsがそこを認識してくれませんので、認識してくれるようにします。

```ruby:config/applications.rb
module sample
	class Application < Rails::Application

		# Railsの自動読み込み対象に/api/以下を登録の意味
		config.paths.add "app/api", glob: "**/*.rb"
		config.autoload_paths += Dir["#{Rails.root}/app/api/*"]
```

###るーてぃんぐ？

どういうURLで接続したらAPIが動くのか、と言う設定ですね。

```ruby:config/routes.rb
	mount Test_api => "/test_api/"
```

###せつめいしょどおり？

ルーティングで「TestAPI」としたならば、moduleも「TestAPI」とするのがコツです。
ファイル名は別に何でもいいと思う。

```ruby:test_api
module Test_api
  class API < Grape::API
    version 'v1', using: :path
    format :json
    formatter :json, Grape::Formatter::Jbuilder

    # プライベートメソッド
    helpers do
      def meth
        "test?"
      end
    end

    resource :test do
      get :test2 do
        "test " + meth
      end
    end
    
  end
end
```

ここまできたら
/test_api/v1/test/test2

のような感じで接続すれば

> test test?

と出力されるはず。

##jbuilder
JSONの出力が超簡単になるよ！
という奴。

参考：
1.[PHPerがRailsデビューしてWebAPIを作りRSpecでテスト書いてCap3/CircleCIでデプロイして分かった事を1ヶ月前の自分に教えたいので、まとめてみた](http://qiita.com/zaru/items/46366919bcbcf97d63ca)

2.[Rails Jbuilderの使い方](http://qiita.com/hmuronaka/items/c4e365cc0a9d465731f8)


###キーの配列を使いたい

```
json.num [1, 5, 10]
# =>[num [1, 5, 10]]

json.array! [1, 5, 10]
# =>[1, 5, 10]
```

##Grape + jbuilder

合わせて使うことで簡単にjson出力できるAPIができます！

参考：
1.[Grape + Railsで、Jbuilderを使ったJSONフォーマットAPIを作る](http://qiita.com/zaru/items/fa64a4e00b76ea6ce36f)

## jquery-ui-rails

まぁ普通のjqueryのgemなのですが、素直に動いてくれませんでした。

アセットパイプラインとやらが普通に動いていれば問題無いそうなのですが...

(RailsにjQuery-uiを導入するときの注意)[http://qiita.com/hachi8833/items/42d50928008d1b3f6400]

もし同じような現象にあった時は、試してみてください！

## ranked-model

データの管理画面を作るときになんかちょうどいいのないかなぁと思って探してみると

[Rails 4で作るドラッグアンドドロップで表示順を変更できるサンプルアプリ(スクリーンキャスト付き)](http://qiita.com/jnchito/items/391fb16d3f69fda9bdae)

（＾ω＾）いいのが在るではないですか！
とても便利でしたので、似たようなものを考えている方は是非！

## json_expressions

友達に教えてもらったものなので、ちょっとまだノウハウが溜まってませんが

APIのテストコートを書くときに「JSONの出力結果に合わせるの面倒くさいなぁ」
となりますよね。そんな時に便利でした！

あまり使い方について記事がないのですが
[Rails でつくる API のテストの書き方（RSpec + FactoryGirl）](http://blog.inouetakuya.info/entry/2013/10/27/200111)

この方が最後のほうでちらっと使っているのが参考になるかと思います。

## timecop

友達に教えてもらったものなの(ry

テストコードを書くときに使うものですが、
日付のテスト等をするときに便利なものです！

[RailsでTimecopを使って日付/時間のテストをする](http://ruby-rails.hatenadiary.com/entry/20141218/1418901424)


## wheneverを使おう

cronって皆さん知ってます？

エンジニアやってて1年目な私ですが、
知ってはいて使ったことなかった。

でもrailsだととても簡単に設定できるよ！

ということでその簡単に設定するためのgemを使ってみたので共有します。

[参考：gemのwheneverを導入してみた @まっしろけっけhatenaBlog](http://shiro-16.hatenablog.com/entry/2015/02/17/000715)

## rails_adminで簡単管理画面！

即席管理画面が欲しかったらこれ！
すぐに作れるぞ！やったね！

[sferik/rails_admin @github](https://github.com/sferik/rails_admin)



# まとめ

書き上がってみるとターゲットとは一体なんだろうというくらい
色々書いてますね。

本とか書いてる人は本当にすごいなぁ...

それでは、お疲れ様でした。