DesignAssembler

備忘録に近い

carrierwaveで画像アップロードAPIサーバー

carrierwaveを使って画像アップロードAPIサーバーを作りました。

どんなの作るか

犬の名前と画像が保存できるサービスのAPIを作ります。 必要なカラムはnameとpicです。

まずは犬データの作成です。名前と画像をPOSTで投げたら名前と画像URLがjsonで返ってきます。

次に犬データを見ます。URLで指定したidの犬をjsonで返ってきます。

作る

Gemfileに以下を追記します。

#Gemfile
gem 'carrierwave'

次にモデルの作成です。

$ rails g model dog name:string pic:string
$ rake db:migrate

nameカラムに犬の名前、picカラムに犬の写真を格納します。

$ rails g uploader DogPicture
      create  app/uploaders/dog_picture_uploader.rb

するとapp/uploaders/dog_picture_uploader.rbができます。

マウントします

#app/model/dog.rb
class Dog < ActiveRecord::Base
  mount_uploader :pic, DogPictureUploader
end

コントローラーを作成します

$ rails g controller dog create show

そしてapp/controllerにapiフォルダを作成し、そこに入れます。 こんな感じに書きました。

#app/controller/api/dog_controller.rb
module Api
class DogController < ApplicationController
  protect_from_forgery :only => ["create"]
  # to avoid error of CSRF

  def create
    @dog = Dog.new(dog_params)
    if @dog.save
      render json: {
        dog: {
          name: @dog.name,
          pic:  @dog.pic.url,
        },
        status: 200
      }
    else
      render json: {
        status: 400
      }
    end
  end

  def show
    @dog = Dog.find(params[:id])
    render json: {
      dog: {
        name: @dog.name,
        pic:  @dog.pic.url
      },
      status: 200
    }
  end

  private

    def dog_params
      params.permit(:name, :pic)
    end
end
end

次にconfig/routes.rbの編集です。以下を追加します。

#config/routes.rb
namespace :dog do
  resources :dog, only: [:show, :create]
end

次はオートロードの設定です。以下をconfig/application.rbに書きます。

config.autoload_paths << Rails.root.join('app', 'uploaders')

結果

サーバーを起動してcurlを投げます。

$ curl -F 'name=inu1' -F 'pic=@prof_mini.jpg' http://localhost:3000/api/dog
{"dog":{"name":"inu1","pic":"/uploads/dog/pic/1/prof_mini.jpg"},"status":200}

$ curl localhost:3000/api/dog/1
{"dog":{"name":"inu1","pic":"/uploads/dog/pic/1/prof_mini.jpg”},”status":200}

成功です。

Rails5ではrails_api gemが統合されてRails::APIができるそうですね。楽しみです。

参考

morizyun.github.io