#はじめに
railsでapiを作るにはrails new appname --apiみたいにするのは知っていたけど具体的なapiの作り方がわからなかったから調べながら作ってみた。
#作るもの
とりあえず作るものとしてはユーザーのデータを送ったり送られたデータをもとにユーザーを作成、編集するもの。
#api用アプリとapiを使うアプリを作る
まずapi用とそれを使うアプリを作る。
rails new api_user --api
rails new get_api_data_user
みたいにつくる。
まずapiから
#api作成
モデルとコントローラーを作る
rails g model user name:string age:integer email:string password:string
rails db:migrate
rails g controller users index show create update
これでok
コントローラーに具体的な処理を書いていく
基本的にapiの場合はjson形式で値をやり取りするっぽい?
なのでviewsは使わず render json:
みたいにjsonの値を出力していく
それでこんな感じ
class UsersController < ApplicationController
def index
@users = User.all
render json: @users
end
def show
@user = User.find params[:id]
render json: @user
end
def update
@user = User.find params[:id]
@user.update(user_params)
end
def create
@user = User.new(user_params)
@user.save
end
private
def user_params
params.require(:user).permit(:name,:age,:email,:password)
end
end
最後にrender json:がついただけで普通
routesに
resources :users
とかいておわり。
#apiを使う側のアプリを作成
apiにデータを送る場合にcurlというコマンドを使う
curl -X GET http://localhost:3000/users
と書いたらlocalhost:3000で動いているapiの/usersにアクセスしてデータをもらってくる
でもそのデータをそのままは使わず
JSON.parse(@users)
みたいにjson形式にする。
こうしなかったら配列として扱えなかった。
なのでusers_controller.rbのindexはこうなる。
def index
@users = `curl -X GET http://localhost:3000/users`
@users = JSON.parse(@users)
end
ちなみに``でコンソールにコマンドをうつことができる。
これで@usersにさっきのapiからusersのデータをjson形式で持ってこられるのでusers/index.html.erbに
<% @users.each do |user| %>
<p>name</p>
<p><%= user["name"] %></p>
<p>age</p>
<p><%= user["age"] %></p>
<p>email</p>
<p><%= user["email"] %></p>
<p>password</p>
<p><%= user["password"] %></p>
<% end %>
でデータをみることができる。
あくまでhashの形なのでuser["name"]としないとデータはとれない。
create updateに関してコントローラーはこんな感じ
def new
end
def create
`curl -X POST -H 'Content-Type:application/json' -d '{ "name": "#{params[:name]}", "age": "#{params[:age]}", "email": "#{params[:email]}", "password": "#{params[:password]}"}' http://localhost:3000/users`
redirect_to users_index_path
end
def edit
end
def update
p `curl -X PATCH -H 'Content-Type:application/json' -d '{ "name": "#{params[:name]}", "age": "#{params[:age]}", "email": "#{params[:email]}", "password": "#{params[:password]}"}' http://localhost:3000/users/#{params[:user_id]}`
end
さっきと違うのは-H 'Content-Type:application/json'みたいしているところ
こう書かないとうまくデータをapiに渡せない
それで全体はこうなる。
class UsersController < ApplicationController
def index
@users = `curl -X GET http://localhost:3000/users`
@users = JSON.parse(@users)
end
def new
end
def create
`curl -X POST -H 'Content-Type:application/json' -d '{ "name": "#{params[:name]}", "age": "#{params[:age]}", "email": "#{params[:email]}", "password": "#{params[:password]}"}' http://localhost:3000/users`
redirect_to users_index_path
end
def edit
end
def update
p `curl -X PATCH -H 'Content-Type:application/json' -d '{ "name": "#{params[:name]}", "age": "#{params[:age]}", "email": "#{params[:email]}", "password": "#{params[:password]}"}' http://localhost:3000/users/#{params[:user_id]}`
end
def show
end
end
#おわりに
アイディアが思い浮かばなかったから変なものができてしまった。
ちなみにapiを試すためにローカルで二つのサーバーを起動したい場合は
rails s -p 4000
みたいにすればlocalhost:4000にアクセスできる
ちなみにユーザ登録とか検索とか画面を表示する以外の部分をほかのapiにやらせるのってありなのかな....?
なんかデータを処理するのと表示するのをはっきり分けられてよさそう
おわり