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






