152
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

updated at

【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!追記。

# 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プロパティを持たせる。

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でのコーディングは終了です。

ただ、これだけではエラーが起きるので設定が必要らしい。

設定

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

8. Railsアプリをつくる

$ rails new Meomoo -d mysql

実際つくる場所はどこでもいいです。

9. DBをつくる

$ 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. モデルの作成

$ 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
$ rake db:migrate

12. コントローラーの作成

apiディレクトリ配下にmemos_controller.rbを作成

$ 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に保存される

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
152
Help us understand the problem. What are the problem?