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ができるそうですね。楽しみです。