edo1z blog

プログラミングなどに関するブログです

Rails5のAPIモードでAPIをつくってみる(1)

プロジェクト作成

$ rails new api1 --api

rails server立ち上げる

$ rails server

おーAPIモードになってる。 とりあえず、商品名と金額を登録・取得できる簡単なAPIをつくってみます。

商品テーブルのscaffoldとtableをつくる

$ rails generate scaffold Item name:string price:int
      invoke  active_record
      create    db/migrate/20170325093816_create_items.rb
      create    app/models/item.rb
      invoke    test_unit
      create      test/models/item_test.rb
      create      test/fixtures/items.yml
      invoke  resource_route
       route    resources :items
      invoke  scaffold_controller
      create    app/controllers/items_controller.rb
      invoke    test_unit
      create      test/controllers/items_controller_test.rb
$ rails db:migrate

エラーになった。intじゃだめっぽい。integerらしい。

$ rails destroy scaffold Item
      invoke  active_record
      remove    db/migrate/20170325093816_create_items.rb
      remove    app/models/item.rb
      invoke    test_unit
      remove      test/models/item_test.rb
      remove      test/fixtures/items.yml
      invoke  resource_route
       route    resources :items
      invoke  scaffold_controller
      remove    app/controllers/items_controller.rb
      invoke    test_unit
      remove      test/controllers/items_controller_test.rb
$ rails generate scaffold Item name:string price:integer
$ rails db:migrate
== 20170325094155 CreateItems: migrating ======================================
-- create_table(:items)
   -> 0.0045s
== 20170325094155 CreateItems: migrated (0.0058s) =============================

とりあえずできた。http://localhost:3000/itemsにアクセスすると商品一覧がみられる。

get /items 商品一覧取得 post /items 商品登録 get /items/1 商品詳細 put|patch /items/1 更新 delete /items/1 削除

postmanで登録してみる

url: (post)http://localhost:3000/items
body: item[name] => 納豆
      item[price] => 200

result

{
  "id": 1,
  "name": "納豆",
  "price": 200,
  "created_at": "2017-03-25T13:12:32.375Z",
  "updated_at": "2017-03-25T13:12:32.375Z"
}

クロスドメインアクセスOKにする場合、下記が必要。 APIファーストでバックエンドとフロントエンドを別々に開発する時にハマるクロスドメインアクセス cyu/rack-cors

Gemfileに下記を追加。既に書いてあってコメントアウトされてるので、コメントを外す。

gem 'rack-cors'

bundle installする

$ bundle install

config/application.rbに下記のような感じで書く。

config.middleware.insert_before 0, Rack::Cors do
  allow do
    origins '*'
    resource '*', :headers => :any, :methods => [:get, :post, :options]
  end
end

ローカル環境だと、上記rack-corsの設定いらなかった。とりあえず、一覧、詳細、追加、修正、削除が全部できている。あとは、認証、認可、検索とか追加して本番環境で試したい。

参考: Rails による API 専用アプリ