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!
追記。
# 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を落として以下を実行。
$ pod install
3. 進化後のプロジェクトをクリックして起動
そして、Finderでプロジェクトを確認してみると、、、
プロジェクトが進化している!!
これからは進化後のプロジェクトで作業します。
4. 部品を配置する(Swift)
上の画像のように、適当にヘッダーとタイトルラベルと保存ボタン
とText View
を配置します。
ここで重要なのは、保存ボタン
とText View
です。この二つを使ってHTTP通信を行います。
5. ソースコードと関連付けする
上の画像のように、Text ViewをtextView
という名前でOutlet接続、ButtonをtapSaveBtn
という名前でAction接続します。
6. モデルオブジェクトとモデルマネージャーをつくる
上の画像のように、Modelsディレクトリを用意し、その下にModel ManagerディレクトリとModel Objectディレクトリをつくる。
Model Managerディレクトリの下には、StockMemos.swift
というNSObjectのファイルをつくり、Model Objectディレクトリの下には、Memo.swift
というNSObjectのファイルをつくる。
7. コードをかく(Swift)
メモクラスにtextプロパティを持たせる。
import UIKit
class Memo: NSObject {
var text: String = ""
}
HTTP通信を行うファイルでAlamofireをインポート
し、HTTP通信に必要な処理を書いていく。
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()メソッドを呼び出す処理を記述。
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でのコーディングは終了です。
ただ、これだけではエラーが起きるので設定が必要らしい。
上と同じように設定してください。
8. Railsアプリをつくる
$ rails new Meomoo -d mysql
実際つくる場所はどこでもいいです。
9. DBをつくる
$ rake db:create
10. ルーティングの設定
apiのディレクトリをはさんでコントローラーをつくるので、
namespaceでルーティングを設定。
Rails.application.routes.draw do
namespace :api, default: {format: :json} do
resources :memos, only: :create
end
end
10. モデルの作成
$ rails g model memo
11. マイグレート
マイグレーションファイルに必要なカラムを追記して
class CreateMemos < ActiveRecord::Migration
def change
create_table :memos do |t|
t.text :text
t.timestamps null: false
end
end
end
$ rake db:migrate
12. コントローラーの作成
apiディレクトリ配下にmemos_controller.rbを作成
$ rails g controller api/memos
13. コントローラーでcreateアクションを定義
memosテーブルにレコードを保存。
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の設定
json.error_message @error_message if @error_message
16. バリデーションの設定
textが空のまま送信してきたらエラメッセージを返す。
class Memo < ActiveRecord::Base
validates :text, presence: true
end