8. resource(s) なルーティング
config/routes.rb
Rails.application.routes.draw do
resources :messages
end
$ rails routes
Prefix Verb URI Pattern Controller#Action
messages GET /messages(.:format) messages#index
POST /messages(.:format) messages#create
new_message GET /messages/new(.:format) messages#new
edit_message GET /messages/:id/edit(.:format) messages#edit
message GET /messages/:id(.:format) messages#show
PATCH /messages/:id(.:format) messages#update
PUT /messages/:id(.:format) messages#update
DELETE /messages/:id(.:format) messages#destroy
10. html 都合の new/edit はこのさい置いとく
Resource HTTP Method Action 意味
/messages GET index 一覧表示(画面)
/messages POST create 新規作成
/message/:id GET show 詳細表示(画面)
/message/:id PATCH/PUT update 更新
/message/:id DELETE destroy 削除
11. HTTP のメソッド
HTTP Method /messages /message/:id
GET index show
PUT/PATCH - update
DELETE - destroy
POST create -
12. HTTP のメソッド
HTTP Method 意図など 安全 冪等
GET リソースの取得 ! !
PUT/PATCH リソースの配置 !❓
DELETE リソースの削除 !❓
POST リソースの生成
13. GET
— リソースの取得. 常に安全で冪等.
— scaffold の実装だと, コレクションへの GET は常に
200 でメンバーへの GET はない場合 404 を返す.
def index
@messages = Message.all
end
def show
end
14. PUT/PATCH
— リソースの配置.
— scaffold の実装の場合存在しない場合は 404 を返す
が, 定義からすれば ID を明示した merge (insert or
update) とした方が適当かも.
def update
respond_to do |format|
if @message.update(message_params)
format.html { redirect_to @message, notice: 'Message was successfully updated.' }
format.json { render :show, status: :ok, location: @message }
else
format.html { render :edit }
format.json { render json: @message.errors, status: :unprocessable_entity }
end
end
end
15. DELETE
— リソースの削除.
— scaffold の実装の場合存在しない場合は 404 を返す
が, 定義からすれば存在しない場合は何もしないのが
適当かも.
def destroy
@message.destroy
respond_to do |format|
format.html { redirect_to messages_url, notice: 'Message was successfully destroyed.' }
format.json { head :no_content }
end
end
16. POST
— リソースの生成
— 「生成」としているのはコレクションリソースに対
する操作であるため.
def create
@message = Message.new(message_params)
respond_to do |format|
if @message.save
format.html { redirect_to @message, notice: 'Message was successfully created.' }
format.json { render :show, status: :created, location: @message }
else
format.html { render :new }
format.json { render json: @message.errors, status: :unprocessable_entity }
end
end
end
17. 60行すこし
class MessagesController < ApplicationController
before_action :set_message, only: [:show, :edit, :update, :destroy]
def index
@messages = Message.all
end
def show; end
def new
@message = Message.new
end
def edit; end
def create
@message = Message.new(message_params)
respond_to do |format|
if @message.save
format.html { redirect_to @message, notice: 'Message was successfully created.' }
format.json { render :show, status: :created, location: @message }
else
format.html { render :new }
format.json { render json: @message.errors, status: :unprocessable_entity }
end
end
end
def update
respond_to do |format|
if @message.update(message_params)
format.html { redirect_to @message, notice: 'Message was successfully updated.' }
format.json { render :show, status: :ok, location: @message }
else
format.html { render :edit }
format.json { render json: @message.errors, status: :unprocessable_entity }
end
end
end
def destroy
@message.destroy
respond_to do |format|
format.html { redirect_to messages_url, notice: 'Message was successfully destroyed.' }
format.json { head :no_content }
end
end
private
def set_message
@message = Message.find(params[:id])
end
def message_params
params.require(:message).permit(:title, :body, :published)
end
end
21. どのようなアクションを準備すべきか?
resources :messages do
post :add_favorite, on: :member
post :remove_favorite, on: :member
end
$ ./bin/rails routes
Prefix Verb URI Pattern Controller#Action
add_favorite_message POST /messages/:id/add_favorite(.:format) messages#add_favorite
remove_favorite_message POST /messages/:id/remove_favorite(.:format) messages#remove_favorite
...
class MessagesController < ApplicationController
def add_favorite
end
def remove_favorite
end
...
➡ (´・ω・`)…
22. どのようなアクションを準備すべきか?
resources :messages do
put :favorite, on: :member
delete :favorite, on: :member
end
$ ./bin/rails routes
Prefix Verb URI Pattern Controller#Action
favorite_message PUT /messages/:id/favorite(.:format) messages#favorite
DELETE /messages/:id/favorite(.:format) messages#favorite
...
class MessagesController < ApplicationController
def favorite # favorite & unfavorite ?
end
...
➡ (´・ω・`)……
23. どのようなアクションを準備すべきか?
resources :messages do
put :favorite, on: :member, action: 'add_favorite'
delete :favorite, on: :member, action: 'remove_favorite'
end
$ ./bin/rails routes
Prefix Verb URI Pattern Controller#Action
favorite_message PUT /messages/:id/favorite(.:format) messages#add_favorite
DELETE /messages/:id/favorite(.:format) messages#remove_favorite
...
class MessagesController < ApplicationController
def add_favorite
end
def remote_favorite
end
...
➡ (´・ω・`)………