To @ToraDady
そんなの知ってるわ、それは違うわ、という部分あったら指摘下さい。
Ruby on RailsのアプリケーションでJSONデータを返す方法などを調べつつ書いていきます。
iOS開発のバックエンドが欲しい、iPhoneからサーバーとデータのやり取りをしたいという場合は、自前でウェブアプリを構築する以外の方法もあります。それがBaaS(Backend as a Service)です。BaaSは、クライアント(iOSのようなモバイルやデスクトップアプリなど)のバックエンドを提供してくれるサービスの総称で、有名どころではParseやFirebaseなどがあります。
すでにRailsアプリがあって、そのモバイルアプリが欲しいという流れでiOS開発を検討しているならわざわざBaaSに乗り換える必要はなさそうですが、一からiOSアプリをつくる&そのバックエンドが欲しい、という場合には、BaaSとRailsどっちがいいのか、というのは考えてみる価値がありそうです。BaaS vs Ruby on Railsで検索してみると、こういう質問が出てきたりします。
iOSエンジニアが一からRailsを覚えるのはけっこう大変なことだと思うので、目的によってはBaaSのようなものも使えるというのを知っておくといいかもしれません。
とは言ったものの、僕はモバイルアプリのバックエンドとしてBaaSを使ったことがない(そもそもモバイルアプリ開発経験がない)ので、なんとも言えません。Railsのいいところに関して言うと、データの管理や提供方法を自分で決められるというところでしょうか。BaaSはあくまでもParseやFirebaseなどが提供するAPIを通じてデータのやり取りをすることになると思いますので、できることが限定されるはずです。
AWSは難しい(僕がよくわからない)ので、Herokuを使ってRailsアプリをデプロイするのが良さそうです。Herokuにデプロイする際に使うものは、Herokuアカウント・Herokuツールベルト・gitの3つになるかと思います。
まずgitは何かと言われたら、通常はバージョン管理ツールと答えるのが正しいです。しかし、Herokuを使う場合にはデプロイツールとしての役割も持つことになります。git自体はすでに(僕なんかよりも詳しく)ご存知だったりするかもしれないので、gitそのものについての説明は省いて、RailsアプリをHerokuにデプロイする流れを書きます。
...と思ったんですけど、HerokuのDocumentation読んだほうがよっぽどわかりやすいような気がしてきたのでそちらを貼ります。
JSONデータを返すRailsアプリを構築する時に最低限何をするかというのを説明するために、ここではブログ記事のモデルのみが存在するアプリを作ってみます。
rails new json_server
railsのgenerateコマンドを使って雛形を生成して、データベースを初期化します。
bin/rails generate model Post title:string body:text
bin/rails generate controller Posts
bin/rake db:migrate
Cocoapods使ってると思うのでたぶん大丈夫だと思います。
プロジェクトで利用するライブラリのバージョンなどは、Gemfileに記載していきます。rails new
でプロジェクトを作成すれば、すでに以下の様なGemfileが作られているはずです。
source 'https://rubygems.org'
# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '4.2.5'
# Use sqlite3 as the database for Active Record
gem 'sqlite3'
# Use SCSS for stylesheets
gem 'sass-rails', '~> 5.0'
# Use Uglifier as compressor for JavaScript assets
gem 'uglifier', '>= 1.3.0'
# Use CoffeeScript for .coffee assets and views
gem 'coffee-rails', '~> 4.1.0'
# See https://github.com/rails/execjs#readme for more supported runtimes
# gem 'therubyracer', platforms: :ruby
# Use jquery as the JavaScript library
gem 'jquery-rails'
# Turbolinks makes following links in your web application faster. Read more: https://github.com/rails/turbolinks
gem 'turbolinks'
# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
gem 'jbuilder', '~> 2.0'
# bundle exec rake doc:rails generates the API under doc/api.
gem 'sdoc', '~> 0.4.0', group: :doc
...
このGemfileが置かれたところで、bundle install
をすればライブラリが読み込まれます。
bundle install --path vendor/bundle
--path
に vendor/bundle
というパスを渡して、gemのインストール場所を指定しています。
ルーティング(「このURLへのリクエストはこのコントローラを呼び出す」という設定)は config/routes.rb
に書きます。
Rails.application.routes.draw do
resources :posts
end
とりあえずこれだけで十分です。このルーティングは、Postというモデル・PostsControllerというコントローラがある前提で書かれます。以下を実行します。
bin/rake routes
出力結果を見ると、どのURIパターンに何というメソッドが割り当てられているかがわかります。
Prefix Verb URI Pattern Controller#Action
posts GET /posts(.:format) posts#index
POST /posts(.:format) posts#create
new_post GET /posts/new(.:format) posts#new
edit_post GET /posts/:id/edit(.:format) posts#edit
post GET /posts/:id(.:format) posts#show
PATCH /posts/:id(.:format) posts#update
PUT /posts/:id(.:format) posts#update
DELETE /posts/:id(.:format) posts#destroy
先ほどの bin/rake routes
で見た通り、このアプリケーションの/posts
というパスに対応するのはPostsController#index
になります(※Rubyのドキュメントではよく、クラス名#インスタンスメソッド名
という記述をします)。
とりあえず、index(一覧)とshow(詳細)のコントローラを作ります。
class PostsController
def index
@posts = Post.limit(20)
render json: @posts
end
def show
@post = Post.find(params[:id])
render json: @post
end
end
Railsにはconsole
というコマンドオプションがあり、それを使えばRailsアプリの実行環境でいろんなことができます。
bin/rails console
ブログ記事を挿入しましょう。
irb(main):001:0> Post.create({title: "寿司食べた", body: "回転寿司安くてうまくて最高。ただ、うには回転寿司で食べるもんじゃないな。"})
(0.0ms) begin transaction
SQL (0.6ms) INSERT INTO "posts" ("title", "body", "created_at", "updated_at") VALUES (?, ?, ?, ?) [["title", "寿司食べた"], ["body", "回転寿司安くてうまくて最高。ただ、うには回転寿司で食べるもんじゃないな。"], ["created_at", "2015-12-28 16:12:15.165223"], ["updated_at", "2015-12-28 16:12:15.165223"]]
(1.3ms) commit transaction
=> #<Post id: 1, title: "寿司食べた", body: "回転寿司安くてうまくて最高。ただ、うには回転寿司で食べるもんじゃないな。", created_at: "2015-12-28 16:12:15", updated_at: "2015-12-28 16:12:15">
これで、サンプルデータが入りました。このRailsアプリにアクセスした時に、JSONでデータが返ってくれば成功っぽいです。
サーバーを立ち上げてみましょう。
bin/rails server
そしたら、アクセスしましょう。JSONのAPIを叩くって感じで、あえてブラウザではなくコマンドからいきます
curl localhost:3000/posts
[{"id":1,"title":"たいとる","body":"ぼでぃー","created_at":"2015-12-28T16:00:06.305Z","updated_at":"2015-12-28T16:00:06.305Z"}]
良いんじゃないでしょうか。
モデルの属性値をそのまま出す場合だけじゃないと思います。そういうときは(TODO: どういうとき?)、JbuilderというDSLを使います。
(TODO: 良い感じのサンプル)
bundle install 時にエラー