【iOS】SwiftでRailsと連携する方法


SwiftでRailsと連携するときの手順を紹介します。

例として、**メモ帳アプリ**をつくります。
アプリの概要は、Text Viewにかいたテキスト(メモ)を、保存ボタンを押すとDBに保存されるとうものだ。

今回は`Alamofire`というpodを利用してHTTP通信を行うので、`cocoapods`のインストールが必要です。(Alamofireを使わなくてもHTTP通信はできるのだが、パフォーマンス向上のために使用)


## 1. cocoapodsのインストール
下記URLを参考にcocoapodsをインストール
http://qiita.com/SoyaTakahashi/items/fdb0d87597eb276056d8


## 2. Alamofireをインストール
Podfileに`pod 'Alamofire', '~> 1.2'`と`use_frameworks!`追記。

```Podfile
# Uncomment this line to define a global platform for your project
# platform :ios, '6.0'
use_frameworks!

target 'YourAppName' do
	pod 'Alamofire', '~> 1.2'
end

target 'YourAppNameTests' do

end
```
Xcodeを落として以下を実行。

```terminal

$ pod install
```


## 3. 進化後のプロジェクトをクリックして起動
そして、**Finderで**プロジェクトを確認してみると、、、

![進化前](http://i.imgur.com/2U7PcA1.png)

![進化後](http://i.imgur.com/T9bcpCG.png)

プロジェクトが進化している！！

これからは進化後のプロジェクトで作業します。


## 4. 部品を配置する(Swift)

![部品の配置](http://i.imgur.com/n0Eczof.png)

上の画像のように、適当にヘッダーとタイトルラベルと`保存ボタン`と`Text View`を配置します。 

ここで重要なのは、`保存ボタン`と`Text View`です。この二つを使ってHTTP通信を行います。


## 5. ソースコードと関連付けする

![部品の配置](http://i.imgur.com/QdkZMyr.png)

上の画像のように、Text Viewを`textView`という名前で**Outlet接続**、Buttonを`tapSaveBtn`という名前で**Action接続**します。


## 6. モデルオブジェクトとモデルマネージャーをつくる

![ディレクトリの配置](http://i.imgur.com/ljvE8Y9.png)

上の画像のように、**Modelsディレクトリ**を用意し、その下に**Model Managerディレクトリ**と**Model Objectディレクトリ**をつくる。
**Model Managerディレクトリ**の下には、`StockMemos.swift`というNSObjectのファイルをつくり、**Model Objectディレクトリ**の下には、`Memo.swift`というNSObjectのファイルをつくる。


## 7. コードをかく(Swift)
メモクラスにtextプロパティを持たせる。

```Memo.swift
import UIKit

class Memo: NSObject {
	var text: String = ""
}
```

HTTP通信を行うファイルで`Alamofireをインポート`し、HTTP通信に必要な処理を書いていく。

```StockMeomos.swift
import UIKit
import Alamofire

class StockMemos: NSObject {
	
	// 保存ボタンが押されたときに呼ばれるメソッドを定義
	class func postMemo(memo: Memo) {
		
		var params: [String: AnyObject] = [
			"text": memo.text
		]
		
		// HTTP通信
		Alamofire.request(.POST, "http://localhost:3000/api/memos", parameters: params, encoding: .URL).responseJSON { (request, response, JSON, error) in
                
                println("=============request=============")
                println(request)
                println("=============response============")
                println(response)
                println("=============JSON================")
                println(JSON)
                println("=============error===============")
                println(error)
                println("=================================")
        }

	}
}
```
これはほぼほぼ定型文です。
HTTPメソッドとURLとparameterを指定して送るだけ。

　
ViewController.swiftの`tapSaveBtn`メソッド内にStockMemos.swiftのpostMemo()メソッドを呼び出す処理を記述。

```ViewController.swift
import UIKit

class ViewController: UIViewController {
    @IBOutlet weak var textView: UITextView!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    @IBAction func tapSaveBtn(sender: UIButton) {
        let memo = Memo()
        memo.text = textView.text
        
        StockMemos.postMemo(memo)
    }

}
```
　
**これでSwiftでのコーディングは終了です。**

ただ、これだけではエラーが起きるので設定が必要らしい。

![設定](http://i.imgur.com/lXROQ9L.png)

上と同じように設定してください。


## 8. Railsアプリをつくる
```terminal
$ rails new Meomoo -d mysql
```
実際つくる場所はどこでもいいです。


## 9. DBをつくる
```terminal
$ rake db:create
```

## 10. ルーティングの設定
apiのディレクトリをはさんでコントローラーをつくるので、
namespaceでルーティングを設定。

```routes.rb
Rails.application.routes.draw do

  namespace :api, default: {format: :json} do
    resources :memos, only: :create
  end

end
```

## 10. モデルの作成
```terminal
$ rails g model memo
```


## 11. マイグレート
マイグレーションファイルに必要なカラムを追記して

```20150525000000_create_memos.rb
class CreateMemos < ActiveRecord::Migration
  def change
    create_table :memos do |t|
      t.text :text
      t.timestamps null: false
    end
  end
end
```
```terminal
$ rake db:migrate
```


## 12. コントローラーの作成
apiディレクトリ配下にmemos_controller.rbを作成

```terminal
$ rails g controller api/memos
```


## 13. コントローラーでcreateアクションを定義
memosテーブルにレコードを保存。

```memos_controller.rb
class Api::MemosController < ApplicationController
  skip_before_filter :verify_authenticity_token, only: :create # どうやらこの記述が必要

  def create
    memo = Memo.new(create_params)
    
    # エラー処理
    unless memo.save # もし、memoが保存できなかったら
      @error_message = [memo.errors.full_messages].compact # エラーが入ってるインスタンス変数を定義
    end
  end

  
  private
  def create_params
    params.permit(:text)
  end
end
```


## 14. createアクションに対応するビュー(JsonJbuilder)をつくる
view/api/memos以下にcreate.json.jbuilderファイをルつくる

`views/api/memos/create.json.jbuilder`


## 15. 送るjsonの設定
```create.json.jbuilder
json.error_message @error_message if @error_message
```


## 16. バリデーションの設定
textが空のまま送信してきたらエラメッセージを返す。

```memo.rb
class Memo < ActiveRecord::Base
  validates :text, presence: true
end
```

　
# 以上16個の作業が終われば、Railsと連携したSwiftアプリができているはずです。

![保存ボタンを押すとDBに保存される](http://i.imgur.com/RTKjB4X.png)