jbuilderで良い感じのハッシュ形式のJSONを返したいならこれだけ押さえておけば大丈夫かも

JSON を返すときに、良い感じにごにょごにょしたいみたいなときってあるじゃないですか。そういうときに jbuilder ではどうやるのかなーと思ってちょっと調べたのでメモしておきます。

基本的な使い方はこんな感じです。

# こう書くと
json.user do |json|
  json.nickname @user.name
end

# こうなる
{
  "user": {
    "nickname": "sasata299"
  }
}


ただ、これだとキーの部分("nickname" の部分)が定数となってしまい、変数が使えません。変数を使ってキーを動的に変えたい場合には set! というメソッドを使います。

例えば、"nickname" の部分を "male" か "female" に動的に変えたいならこんな感じです。

# こう書くと
json.user do |json|
  json.set! @user.gender, @user.name
end

# こうなる
{
  "user": {
    "male": "sasata299"
  }
}

それでも飽き足らない、「俺はこんな単純な値じゃなくてもっと複雑な構造のデータを返したいんだ!!」っていう人はこんな感じにすればおkです。set! メソッドにブロックを渡すだけ。

# こう書くと
json.user do |json|
  json.set! @user.gender do
    json.array!(@user.products) do |product|
      json.extract! product, :id, :name
    end
  end
end

# こうなる
{
  "user": {
    "male": [
      {
        "id": 1,
        "name": "商品1"
      },
      {
        "id": 2,
        "name": "商品2"
      },
      {
        "id": 3,
        "name": "商品3"
      }
    ]
  }
}

このくらい知っていればだいたいのことは出来るはず、、><

WebSocket通信を簡単に利用するためのクラウドサービスPusherが便利すぎて泣いた

こんにちは!最近は Objective-C を使ってiOSアプリの開発も行っています。ささたつです。

さて、サーバ (Rails) と通信するアプリで、iOS側でいちいち再読み込みしなくても新しい情報が流れてくる、みたいなのがやりたくて Websocket をごにょごにょしていたんです。

まずは Rails 側で Websocket 使うには websocket_rails が良さそうだということでこれを使って実装しました。よしよし動いたと思っていたんですが、iOS側で Websocket を扱おうと思ったら、、あれれ。

iOS側では SocketRocket という square が作ったライブラリを利用しようとしたんです。が、Rails側からいくら送信してもいっこうに iOS側にその通知が流れてきません。。いろいろ見てみるとどうも SocketRocket は websocket_rails の channel の仕組みに対応していない模様><。


マジかー、と思って何か別の方法を探しているときに今回紹介する Pusher を見つけました。Pusher は Websocket 通信を良い感じに捌いてくれるクラウドサービスです。

Pusher
使い方も簡単で、まず Rails側は @object っていうデータを渡すとするとこんな感じ。簡単。

Pusher['チャンネル名'].trigger('create', object: @object)


iOSアプリ側では Pusher に websocket 通信をして

self.client = [PTPusher pusherWithKey:@"Pusherのキー" delegate:self encrypted:YES];
[self.client connect];

あとはこんな感じでデータを受け取れるので、好きなように処理するという感じです。簡単。

PTPusherChannel *channel = [self.client subscribeToChannelNamed:@"チャンネル名"];
[channel bindToEventNamed:@"create" handleWithBlock:^(PTPusherEvent *channelEvent) {
    // channelEvent.data で渡ってくるデータが受け取れる
}];

非常に簡単に使えるし(チャンネルにも対応してる)、セキュリティ的なところも担保されてるので使いやすそうだなぁと思いました。こちらからは以上です。

「KARAAGEファーストガイド」を執筆しました

今日も良い天気ですね。みなさまいかがお過ごしでしょうか。

今日はひとつご報告があります。

拙著として、「NoSQLデータベースファーストガイド」ならびに「Hadoopファーストガイド」を執筆させていただいておりましたが、この度めでたくシリーズ最新作「KARAAGEファーストガイド」を執筆し、発売することとなりました!からあげエンジニアを名乗り続けて数年、こんな日が来るなんて夢のようです。

KARAAGEファーストガイド

内容ですが、このような内容となっております。ぜひAmazonやお近くの書店でお買い求めいただければ幸いです。

- 美味しいからあげを作るための7つの方法
- からあげなのか?竜田揚げなのか?
- 店で食べるからあげと、家で揚げるからあげの違いとは
- からあげを食べると痩せる!?

RailsエンジニアがObjective-Cをしばらく触ってみての所感

進捗ダメです

Web側の開発(Railsとか)って必要な振る舞いがあったらそれに向かって自分でガシガシ処理を作って組み合わせて実現するイメージ。

一方、iOSアプリ開発では、任意の振る舞いに対して様々な UIKit のメソッドが用意されていてそれらが自動的に呼ばれるので、それらを適切に実装してあげる(必要であれば追加の処理も加えていく)イメージ。

考え方というか文化?が違うから面白いなぁ。StoryBoard がいろいろわからなくてツライ感じはあるけど。。コンフリクトしたら泣けるし。ほんとに泣ける。でも起動したらサクサク動いてくれるの嬉しいw

今更だけどiOSアプリでviewDidLoadとかviewWillAppearとかが呼ばれるタイミングをまとめてみる

最近iOSアプリを作っているので、このブログでもそろそろ Objective-C ネタを出していこうかと思います(*゚∀゚)っ

objective-c

ということで、今回は viewDidLoad や viewWIllDisappearなどの呼ばれるタイミングを見ていきましょうか。それぞれが呼ばれるのはこういうときですよね。

viewDidLoad:インスタンス化された直後(初回に一度のみ)
viewWillAppear:画面が表示される直前
viewDidAppear:画面が表示された直後
viewWillDisappear:別の画面に遷移する直前
viewDidDisappear:別の画面に遷移した直後

さて、試してみるためにStoryboard でこんな感じの単純な遷移を作ってみました。

Storyboardでの簡単な遷移
※最初 ViewController にいて、Next っていうボタンをタップすると NextViewController に遷移


1) 起動したとき

まず、起動時( ViewController が表示される)には以下の順番で呼ばれます。これはわかりやすいですよね。

ViewController viewDidLoad
ViewController viewWillAppear
ViewController viewDidAppear


2) Nextボタンをタップして遷移したとき

次に、ViewController から NextViewController に遷移したときには以下の順番で呼ばれます。

NextViewController viewDidLoad
ViewController viewWillDisappear
NextViewController viewWillAppear
ViewController viewDidDisappear
NextViewController viewDidAppear


3) 戻ったとき

最後に、そこからナビゲーションバーの戻るで戻ってみましょう。このときは ViewController のviewDidLoad はもうすでに呼ばれているため、呼ばれません。

NextViewController viewWillDisappear
ViewController viewWillAppear
NextViewController viewDidDisappear
ViewController viewDidAppear

viewDidLoad が最初なのと、複数の UIViewController が交互に呼ばれてるのが自分的にはちょっと意外でした。これからもときどき見直そうっと :)
karaage299 at gmail.com




寄稿した記事

Ruby Freaks Lounge (28,30)
NoSQLを試してみる

作ったもの

カープ戦速報ボット
まとめったー
YouTube Oricon Ranking
NicoNicoブックマーク
ねたばれ見る?


ブックマーク数



購読者数



 
RSS登録
Subscribe with livedoor Reader