MENU

溶けかけてるうさぎ HP BLOG TOP RECENT ARTICLES POPULAR ARTICLES ABOUT THIS BLOG

CATEGORY

大学 (85) 航空宇宙 (55) 写真 (25) 旅行 (14) 飯・酒 (11) コンピュータ (88) その他 (13)

TAG

ARCHIVE

2018 (92) 2017 (80) 2016 (0)

RECENT

【駅メモ】4年目に突入して,ようやく3000駅突破 【WebRTC】Raspberry Pi搭載ロボットをWebRTCで遠隔操作しようとして失敗した 【航空宇宙】航空宇宙アドベントカレンダー 始まります! 【Perl】YAPC::Tokyo 2019 のチケットを確保しました! 【カメラ】Canonから富士フイルムに乗り換えました

【Ruby on Rails】API作成のためのCode / Command Snippet

2018-08-15

Ruby初心者,API作成初心者の人間が3日でRailsでAPIサーバーをつくるお勉強をしている.

DeNAのインターンシップに向けて,とりあえずSnippet的ななにかをここにどんどん追記していこうと思う.

 

トップ画像の出典はこちら

1.環境

Microsoft Windows 10 Home 1803 (64bit)

Ruby 2.5.1p57 (2018-03-29 revision 63029) [x64-mingw32]

gem 2.7.7

Rails 5.2.1

gem mysql2 0.5.2 x64-mingw32

MySQL Ver 8.0.12 for Win64 on x86_64 (MySQL Community Server - GPL)

2.MVCアーキテクチャー

の図がとてもわかり易かったので,ここに転載しておく.

このイメージを忘れないようにする.

3.命名規則

Controller

   コントローラ名         items / rubyOnRails
   コントローラクラス名         ItemsController / RubyOnRailsController
   ファイル名         items_controller.rb / ruby_on_rails_controller.rb
   モデル名         item ※

 

※ 1つのモデルを扱うためのコントローラの場合,モデルの複数形をコントローラ名にすることが多い.

Model / Databese

   モデル名         title
   モデルクラス名         Title
   テーブル名         titles

 

加えて,キーについて

出典:

主キーはid,外部キーは${table_name[単数形]}_id

4.General Snippet

データベースを指定・APIモードでアプリケーション作成

出典:,

$ rails new ${app_name} --api -d mysql

ローカルサーバーでアプリケーションの起動

アプリケーションルートで以下のコマンドを実行.

localhostの3000 portでWEBrickが動く.

$ rails server

ローカルサーバーでのPrintデバッグ

普通にputsすればできた.

JSONで出力するアクション

def index
  json = {name: 'test', age: 5}
  render :json => json
end

Scaffoldを使ったアプリケーション雛形の作成

$ rails generate scaffold friend name:string address:string description:text
$ rake db:create
$ rake db:migrate

5.Controller Snippet

コントローラ作成

$ rails generate controller ${controller_name}

コントローラ削除

$ rails destroy controller ${controller_name}

Strong Parameters

許可したパラメタだけを受け取るセキュアな方法.

出典:

private
  def user_params
    params.require(:user).permit(:name, :email)
  end
  def user_arr_params
    params.require(:user).permit(:name, email: []) # 配列の場合
  end

6.Routing Snippet

ルーティング確認

$ rake routes

RESTfulなルーティング設定

以下をconfig/routes.rbに追加.

resources :${resources}, :only => [:${action1}, :${action1}, ...]

上に加えて,いくつか追加

出典:

  resources :friends, :only => [:index, :create] do
    post 'hoge',      :on => :member      # POST /friends/1/hoge
    post 'fuga',      :on => :collection  # POST /friends/fuga
  end

7.Model / Databese Snippet

アプリケーション作成後の最初のDB作業

app_root/config/database.ymlで,MySQLのusername, passwordを設定.

その後,アプリケーションルートで以下のコマンドを実行.

$ rake db:create

モデルの作成

$ rails generate model ${model_name}

マイグレーションの実行

$ rake db:migrate

マイグレーションのロールバック

$ rake db:rollback STEP=${num}

初期データの挿入

$ rake db:seed

DBの初期化

rake db:seedを複数回実行すると,二重に登録される.

以下で空っぽにできる.

$ rake db:migrate:reset

DBの削除

$ rake db:drop

8.MySQL

データベース参照

mysql> show databases
mysql> use ${db_name}
mysql> show tables;
mysql> show columns from ${table_name};
mysql> select * from ${table_name};

9.Windowsコマンドで GET / POST

GET / DELETE

> curl http://localhost:3000/friends -X GET
> curl http://localhost:3000/friends/1 -X GET
> curl http://localhost:3000/friends/2 -X DELETE

POST

> curl http://localhost:3000/friends -X POST ^
    -d "friend[name]=Tokugawa" ^
    -d "friend[address]=saitama" ^
    -d "friend[description]=hoge" 

POST (JSON)

> curl http://localhost:3000/friends -X POST -H 'Content-Type:application/json' --data-binary "{\"friend\":{\"name\":\"Okita\",\"address\":\"kanagawa\",\"description\":\"fuga\"}}"

だと,Railsに{"{\"friend\":{\"name\":\"Okita\",\"address\":\"kanagawa\",\"description\":\"fuga\"}}"=>nil, "controller"=>"friends", "action"=>"create"}と認識されて詰む.

 

Cygwinなら,

curl http://localhost:3000/friends -X POST -H 'Content-Type:application/json' -d '{"friend":{"name":"Okita","address":"kanagawa","description":"fuga"}}'

でOKだった.

POST (日本語をJSON)

JSONの中身を日本語でやったら,

Mysql2::Error: Incorrect string value: '\x8F\xAC\x90\xEC' for column 'name' at row 1

とか出て死亡.

 

PowerShellで以下でOKだった.

$json = '{"friend":{"name":"小川","address":"kanagawa","description":"fuga"}}'
$ejson = [System.Text.Encoding]::UTF8.GetBytes($json)
Invoke-RestMethod `
    -Uri http://localhost:3000/friends `
    -Method POST `
    -ContentType 'application/json' `
    -Body $ejson

10.関連記事

11.出典

RubyLife. RailsにおけるMVC(モデル/ビュー/コントローラ). Retrieved August 15, 2018, from https://www.rubylife.jp/rails/ini/index7.html
RubyLife. MySQL用のデータベース設定ファイル(database.yml). Retrieved August 15, 2018, from https://www.rubylife.jp/rails/model/index2.html
Qiita. はじめてのRails API. Retrieved August 15, 2018, from https://qiita.com/c5meru/items/1c921676de8a5a038f70
きゃまなかのブログ. 【Ruby on Rails】require と permit の使い方がよく分からない. Retrieved August 15, 2018, from http://techblog.kyamanak.com/entry/2017/08/29/012909
RubyLife. ルーティングにアクションを追加. Retrieved August 15, 2018, from https://www.rubylife.jp/rails/routing/index6.html
RAILS GUIDES. Active Record の基礎. Retrieved August 15, 2018, from https://railsguides.jp/active_record_basics.html

コメントを投稿

名前

Email (※公開されることはありません)

コメント