Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Rails Controller Fundamentals

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.

Rails Controller Fundamentals

Avatar for SAKAGUCHI Takashi

SAKAGUCHI Takashi

September 24, 2018
Tweet

More Decks by SAKAGUCHI Takashi

Other Decks in Technology

Transcript

  1. ͖͞ʹ͓఻͑ — ͪΐͬͱͨ͠ Rails ίʔυΛಈ͔ͨ͠Γ͠·͢. ҎԼ ͷঢ়ଶ͕खݩʹ͋Δͱ, Ұॹʹࢼͨ͠ΓͰ͖·͢. — Ruby

    2.5.1 , Rails 5.2.1 Ͱ࣮ࢪ͠·͕͢, ͦ͜·Ͱ ݫີʹ߹ΘͤΔඞཁ͸ͳ͍Ͱ͢. — gem sqlite3. (rails new Ͱ database Λࢦఆ͠ͳ͍ ͷͰطఆͰ࢖͍ͬͯΔ͚ͩͰ͋Γ, ߦؒಡΜͰผ DB ΛࢦఆͰ͖Ε͹ͦΕͰ OK Ͱ͢)
  2. ࣗݾ঺հ — SAKAGUCHI Takashi — Office UMMM LLC — Ruby

    ͱ͔ Rails ͱ͔͕ͪΐͬͱͰ͖Δ͓͡͞ΜͰ͢
  3. ؆୯ͳΞϓϦΛ࡞Γͭͭ $ ruby -v ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-linux]

    $ rails -v Rails 5.2.1 $ rails new example --skip-active-storage ग़ྗলུ... $ cd example/ $ ./bin/rails s ➡ http://localhost:3000
  4. ؆୯ͳΞϓϦΛ࡞Γͭͭ $ ./bin/rails scaffold message \ title body:text \ published:boolean

    $ ./bin/rails db:migrate ➡ http://localhost:3000/ messages
  5. 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
  6. 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 ࡟আ
  7. HTTP ͷϝιου HTTP Method ҙਤͳͲ ҆શ ႈ౳ GET Ϧιʔεͷऔಘ !

    ! PUT/PATCH Ϧιʔεͷ഑ஔ !❓ DELETE Ϧιʔεͷ࡟আ !❓ POST Ϧιʔεͷੜ੒
  8. GET — Ϧιʔεͷऔಘ. ৗʹ҆શͰႈ౳. — scaffold ͷ࣮૷ͩͱ, ίϨΫγϣϯ΁ͷ GET ͸ৗʹ

    200 Ͱϝϯόʔ΁ͷ GET ͸ͳ͍৔߹ 404 Λฦ͢. def index @messages = Message.all end def show end
  9. 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
  10. 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
  11. 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
  12. 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
  13. ͲͷΑ͏ͳΞΫγϣϯΛ४උ͢΂͖͔? 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 ... ➡ (´ɾТɾ`)…
  14. ͲͷΑ͏ͳΞΫγϣϯΛ४උ͢΂͖͔? 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 ... ➡ (´ɾТɾ`)……
  15. ͲͷΑ͏ͳΞΫγϣϯΛ४උ͢΂͖͔? 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 ... ➡ (´ɾТɾ`)………
  16. ϧʔςΟϯάͷઃܭΨΠυϥΠϯ — resource(s) Ͱఏڙ͞ΕΔΞΫγϣϯҎ֎Λආ͚Δ — index, show, new, create, edit,

    update, destroy ͷΈ — config/routes.rb Ͱ get ͱ͔ post ͱ͔Λͳ Δ΂͘࢖Θͳ͍.
  17. ϧʔςΟϯάͷઃܭΨΠυϥΠϯ — ࠓճͷྫͰ͸ /messages/:message_id/ favorite ʹରͯ͠ PUT/DELETE Ͱ࣮ݱ — DELETE

    ͔ͩΒͱݴͬͯ, ࣮ࡍʹ DB ্ͰσʔλΛ ࡟আ͢Δඞཁ͸ͳ͍. — URI ͷϦιʔεʹର͠, DB ͰͷӬଓԽํ๏͸શ ͘ผͷ࿩. — DBߏ੒ม͑Δͨͼʹ URIߏ੒ม͑ͳ͍Ͱ͠ΐ?
  18. ࠶ߟ - ϧʔςΟϯά resources :messages do resource :favorite, only: %i[update

    destroy], module: 'messages' end $ ./bin/rails routes Prefix Verb URI Pattern Controller#Action message_favorite PATCH /messages/:message_id/favorite(.:format) messages/favorites#update PUT /messages/:message_id/favorite(.:format) messages/favorites#update DELETE /messages/:message_id/favorite(.:format) messages/favorites#destroy ...
  19. ࠶ߟ - ίϯτϩʔϥ # app/controllers/messages/favorites_controller.rb class < Messages::FavoritesController before_action :set_message

    def update respond_to do |format| if @message.update(favorited: true) format.html { redirect_to @message, notice: 'Favorited.' } else format.html { redirect_to @message, alert: 'Favorite failed.' } end end end def destroy respond_to do |format| if @message.update(favorited: false) format.html { redirect_to @message, notice: 'Unfavorited.' } else format.html { redirect_to @message, alert: 'Unfavorite failed.' } end end end private def set_message @message = Message.find(params[:message_id]) end end # (json লུ.)
  20. view template ͷ୳ࡧॱং — ίϯτϩʔϥͷܧঝπϦʔ — MessagesController — < ApplicationController

    — ➡ ҎԼͷॱʹ୳ࡧ͞ΕΔ 1. app/views/messages/* 2. app/views/application/*
  21. view template ͷ୳ࡧॱং — ྫ͑͹ Messages ͷαϒΫϥεͷ Foos Λ࡞ͬͨΒ —

    FoosController < MessagesController — ➡ ҎԼͷॱʹ୳ࡧ͞ΕΔ 1. app/views/foos/* 2. app/views/messages/* 3. app/views/application/*
  22. ͪΐͬͱͨΊͦ͏ $ mkdir app/views/application $ mv app/views/messages/index.html.erb app/views/application/ ➡ ৔ॴҠͯ͠΋ಈ͘.

    $ cp app/views/application/index.html.erb app/views/messages/index.html.erb $ echo '<h2>΄͛</h2>' >> app/views/messages/index.html.erb ➡ messages/ ͕༏ઌ.
  23. ͨͱ͑͹͜ΜͳϧʔςΟϯά — /messages - ϝοηʔδҰཡ — ͜Εʹରͯ͠ɺ /messages/draft ͱ͍͏ URL

    Λ४ උ͢Δ — جຊతʹ͸ /messages ͱಉ͡. — ͨͩ͠, published ͕ false ͷσʔλͰϑΟϧλ ͞Εͨঢ়ଶͱ͢Δ.
  24. /messages/draft Λͭ͘Δ - 1/4 app/controllers/messages_controller.rb def index - @messages =

    Message.all + @messages = message_scope end private + def message_scope + Message.all + end + def set_message
  25. /messages/draft Λͭ͘Δ - 3/4 config/routes.rb Rails.application.routes.draw do + namespace :messages

    do + resources :drafts, only: %i[index] + end resources :messages end
  26. /messages/draft Λͭ͘Δ - 4/4 config/routes.rb Rails.application.routes.draw do namespace :messages do

    - resources :drafts, only: %i[index] + resources :drafts, only: %i[index], path: 'draft' end resources :messages end ➡ Ҏ্ ❗ Ϗϡʔͷमਖ਼ͳͲ͸ͳ͠
  27. ·ͱΊ — scaffold ͷు͘ίϯτϩʔϥ͸ྑ͍ίʔυ. — routes ʹ͸ͳΔ΂͘ resource(s) ͚ͩΛهड़. —

    URIͰσβΠϯ͢ΔϦιʔεͱ DBӬଓԽ͸ผͷ࿩. — template inheritance Λ͏·͘࢖͓͏. — ڞ௨ͷςϯϓϨʔτ͸ app/views/application/ σΟϨΫτϦ