Slide 1

Slide 1 text

TechTrain RoRϋϯζΦϯ 2019-4-13 (౔) https://connpass.com/event/124681/

Slide 2

Slide 2 text

ࣗݾ঺հ • Ά͜ͻͰʢञҪʣ • גࣜձࣾZIZAIɹWEBΤϯδχΞ • OthloTechͷ୅ද΍ͬͯ·ͨ͠ • өըɾ༸υϥϚʢSUITS)ɾήʔϜ࣮گʢఋऀʣΛݟΔͷ͕޷͖ • GitHubɿpokohideɹTwitterɿ@hyde141421356

Slide 3

Slide 3 text

גࣜձࣾZIZAI • 2015೥ʹ໊ݹ԰Ͱੜ·Εͨϕϯνϟʔ • 2िؒલ·ͰʮגࣜձࣾDUOʯͰͨ͠ • ࠓͰ͸ࣾһ਺100໊Ҏ্ • ʮגࣜձࣾDUO͸ɺຊ೔Λ΋ͬͯ4೥ͷྺ࢙ʹນΛด͡·͢ɻʯ (https:/ /note.mu/daichiajt/n/n8cb50cf7fadd)

Slide 4

Slide 4 text

RoRϋϯζΦϯ

Slide 5

Slide 5 text

RoRϋϯζΦϯ֓ཁ • ʮΦλΫλΠϓ਍அʯΛϕʔεͱͨ͠RailsΞ ϓϦΛ։ൃ • ࡞ۀ͸2࣌ؒ͘Β͍ʁ • ࠷ޙʹɺ͜ͷఔ౓ͷϛχΞϓϦͰ΋࣮ࡍʹϦ Ϧʔε͢Δ·Ͱʹߦ͏Ұ޻෉ͳͲΛ঺հ

Slide 6

Slide 6 text

#IRIAM ΦλΫλΠϓ਍அ https:/ /shindan.iriam.com/

Slide 7

Slide 7 text

#IRIAM ΦλΫλΠϓ਍அ • 10໰ͷ࣭໰ʹ౴͑ͯͦͷ݁Ռ͔ΒʮΦλΫλΠϓʯΛ਍அ → ਍அ݁Ռ͔ΒߋʹIRIAMͰσϏϡʔ͍ͯ͠ΔϥΠόʔ͔ Β͓͢͢ΊΛϨίϝϯυ • ͱ͍͏RailsϛχΞϓϦ • TwitterͰόζΒͤΔΛ໨తʹ։ൃ

Slide 8

Slide 8 text

IRIAM ͱ͸ https:/ /iriam.com/ ௿஗Ԇɾ௿௨৴ྔɾߴը࣭ͷόʔνϟϧϥΠϒ഑৴ΞϓϦ

Slide 9

Slide 9 text

ࠓճ࡞ΔRailsΞϓϦ ࣭໰ʹ౴͑ͯɺ݁ՌΛදࣔ͢ΔΞϓϦ https:/ /serene-reaches-15179.herokuapp.com/

Slide 10

Slide 10 text

ϋϯζΦϯͷྲྀΕ • Railsͷ։ൃ؀ڥͷߏஙɺαʔϏεઃܭ • ճ౴σʔλΛαʔόʔʹૹ৴ɺ݁ՌΛදࣔ • CSSͰճ౴ɺ݁ՌϖʔδΛσβΠϯ • ࣗ༝ʹΧελϚΠζʂ

Slide 11

Slide 11 text

Railsͷ։ൃ؀ڥΛߏங $ git clone https://github.com/pokohide/rails_app_for_tech_train.git $ cd rails_app_for_tech_train ## DockerͰRails؀ڥΛߏங $ docker-compose build ## σʔλϕʔε(PostgreSQL)Λ࡞੒ $ docker-compose run web rails db:create ## ্ཱͪ͛Δ $ docker-compose up ## GET http://localhost:3000/ ## Yay!! You’re on Rails!!

Slide 12

Slide 12 text

Railsͷ։ൃ؀ڥΛߏங http:/ /localhost:3000/

Slide 13

Slide 13 text

ςʔϒϧઃܭ Questionςʔϒϧ DPOUFOU 4USJOH PSEFS@JOEFY *OUFHFS Choiceςʔϒϧ RVFTUJPO@JE *OUFHFS DPOUFOU 4USJOH BUUS@ *OUFHFS BUUS@ *OUFHFS BUUS@ *OUFHFS BUUS@ *OUFHFS ※ ޙͰઆ໌͠·͕͢ɺ͜Ε͸ϕετϓϥΫςΟεͰ͸͋Γ·ͤΜ 1 N

Slide 14

Slide 14 text

ςʔϒϧઃܭ - Πϝʔδ 1ͭͷ࣭໰(Question)ʹରͯ͠ɺ 4ͭͷબ୒ࢶ(Choice)͕ඥ෇͍͍ͯΔ ͜ͷબ୒ࢶΛબ୒͢Δͱ ଐੑ1 (attr_1) ͕ 4ϙΠϯτ ଐੑ2 (attr_2) ͕ 3ϙΠϯτ ଐੑ3 (attr_3) ͕ 1ϙΠϯτ ଐੑ4 (attr_4) ͕ -3ϙΠϯτ

Slide 15

Slide 15 text

αʔϏεͷྲྀΕ ௿஗Ԇɾ௿௨৴ྔɾߴը࣭ͷόʔνϟϧϥΠϒ഑৴ΞϓϦ ࣭໰Λճ౴ޙɺબΜͩબ୒ࢶͷଐੑͷ߹ܭ஋ ʢଐੑ1͸12ϙΠϯτɺଐੑ2͸1ϙΠϯτ… ʣ ʹԠͯ͡ɺ݁ՌΛग़͠෼͚Δײ͡

Slide 16

Slide 16 text

ModelΛఆٛ

Slide 17

Slide 17 text

QuestionϞσϧΛ࡞੒ (1) ## QuestionςʔϒϧΛ࡞੒͢Δ
 $ docker-compose run web rails g model Question content:string order_index:integer ## => # create db/migrate/20190330094200_create_questions.rb # create app/models/question.rb

Slide 18

Slide 18 text

QuestionϞσϧΛ࡞੒ (1.1) # db/migrate/20190330094200_create_questions.rb class CreateQuestions < ActiveRecord::Migration[5.2] def change create_table :questions do |t| t.string :content t.integer :order_index t.timestamps end end end

Slide 19

Slide 19 text

QuestionϞσϧΛ࡞੒ (1.2) # db/migrate/20190330094200_create_questions.rb class CreateQuestions < ActiveRecord::Migration[5.2] def change create_table :questions do |t| t.string :content t.integer :order_index, null: false, default: 0 t.timestamps end end end # order_indexʹNOT NULL੍໿ͱॳظ஋0Ληοτ

Slide 20

Slide 20 text

QuestionϞσϧΛ࡞੒ (2) ## DBʹϚΠάϨʔγϣϯ $ docker-compose run web rails db:migrate ## QuestionϞσϧʹίϯιʔϧ͔ΒΞΫηεՄೳʹ $ docker-compose run web rails console > Question => Question(id: integer, content: string, order_index: integer, created_at: datetime, updated_at: datetime)

Slide 21

Slide 21 text

ChoiceϞσϧΛ࡞੒ (1) ## ChoiceςʔϒϧΛ࡞੒͢Δ $ docker-compose run web rails g model Choice question:references content:string attr_1:integer attr_2:integer attr_3:integer attr_4:integer ## => # create db/migrate/20190330095049_create_choices.rb # create app/models/choice.rb

Slide 22

Slide 22 text

QuestionϞσϧΛ࡞੒ (1.1) # db/migrate/20190330094200_create_questions.rb class CreateChoices < ActiveRecord::Migration[5.2] def change create_table :choices do |t| t.references :question, foreign_key: true t.string :content t.integer :attr_1 t.integer :attr_2 t.integer :attr_3 t.integer :attr_4 t.timestamps end end end

Slide 23

Slide 23 text

QuestionϞσϧΛ࡞੒ (1.2) # db/migrate/20190330094200_create_questions.rb class CreateChoices < ActiveRecord::Migration[5.2] def change create_table :choices do |t| t.references :question, foreign_key: true t.string :content t.integer :attr_1, null: false, default: 0 t.integer :attr_2, null: false, default: 0 t.integer :attr_3, null: false, default: 0 t.integer :attr_4, null: false, default: 0 t.timestamps end end end # order_indexʹNOT NULL੍໿ͱॳظ஋0Ληοτ

Slide 24

Slide 24 text

ChoiceϞσϧΛ࡞੒ (2) ## DBʹϚΠάϨʔγϣϯ $ docker-compose run web rails db:migrate ## ChoiceϞσϧʹίϯιʔϧ͔ΒΞΫηεՄೳʹ $ docker-compose run web rails console > Choice => Choice(id: integer, question_id: integer, content: string, attr_1: integer, attr_2: integer, attr_3: integer, attr_4: integer, created_at: datetime, updated_at: datetime) ## ·ͩQuestionϞσϧ͔ΒChoiceϞσϧʹ͸ΞΫηεͰ͖ͳ͍ > Question.new.choices =>NoMethodError: undefined method `choices' for #

Slide 25

Slide 25 text

Question - Choice ͷϦϨʔγϣϯఆٛ # app/models/question.rb class Question < ApplicationRecord has_many :choices end # app/models/choice.rb class Choice < ApplicationRecord belongs_to :question end

Slide 26

Slide 26 text

ςʔϒϧઃܭ Questionςʔϒϧ DPOUFOU 4USJOH PSEFS@JOEFY *OUFHFS Choiceςʔϒϧ RVFTUJPO@JE *OUFHFS DPOUFOU 4USJOH BUUS@ *OUFHFS BUUS@ *OUFHFS BUUS@ *OUFHFS BUUS@ *OUFHFS ※ ޙͰઆ໌͠·͕͢ɺ͜Ε͸ϕετϓϥΫςΟεͰ͸͋Γ·ͤΜ 1 N

Slide 27

Slide 27 text

ॳظσʔλͷૠೖ ## db/fixtures/development/01_question.rb ## db/fixtures/development/02_choice.rb $ docker-compose run web rails db:seed_fu == Seed from /rails_app_for_tech_train/db/fixtures/development/01_question.rb - Question {:id=>1, :order_index=>1, :content=>"΋͋͠ͳ͕ͨεʔύʔώʔϩʔͷੈքʹ͍Δͱ ͨ͠৔߹ɺͲΜͳεΩϧ͕ཉ͍͠Ͱ͔͢ʁ"} - Question {:id=>2, :order_index=>2, :content=>”΋͋͠ͳ͕ͨεϚϗήʔϜͰετϨεൃࢄΛ͢ Δ৔߹ɺͲΜͳήʔϜΛબͼ·͔͢ʁ"} … == Seed from /rails_app_for_tech_train/db/fixtures/development/02_chocie.rb - Choice {:question_id=>1, :content=>"ࣗ༝ࣗࡏʹม਎Ͱ͖ΔεΩ ϧ", :attr_1=>1, :attr_2=>3, :attr_3=>5, :attr_4=>1} - Choice {:question_id=>1, :content=>"εϐʔυઓಆೳྗͱߴ͍ӡಈεΩϧ ", :attr_1=>4, :attr_2=>3, :attr_3=>0, :attr_4=>1} … ॳظσʔλ͸༻ҙͯ͋͠Γ·͢

Slide 28

Slide 28 text

ೖΕͨσʔλΛ৮ͬͯ֬ೝʂ $ docker-compose run web rails console > Question.count => 5 > Question.first.content => “΋͋͠ͳ͕ͨεʔύʔώʔϩʔͷੈքʹ͍Δͱͨ͠৔߹ɺͲΜͳεΩϧ͕ཉ͍͠Ͱ͢ ͔ʁ” > Question.first.choices.pluck(:content) => ["ࣗ༝ࣗࡏʹม਎Ͱ͖ΔεΩϧ", "εϐʔυઓಆೳྗͱߴ͍ӡಈεΩϧ", "ے೑͕ൃ ୡͨ͠ݟࣄͳ೑ମͱɺఈ஌Εͳ͍ύϫʔ͕͋ΔεΩϧ", "͘͢͝ڧྗͳ೦ྗͱ৺ཧత߈ܸε Ωϧ"]

Slide 29

Slide 29 text

Controller͔ΒσʔλΛૢ࡞

Slide 30

Slide 30 text

Controller͔ΒσʔλΛૢ࡞ ͜͜

Slide 31

Slide 31 text

ControllerΛ࡞੒ $ docker-compose run web rails g controller Questions index result create app/controllers/questions_controller.rb route get 'questions/index' get 'questions/result' create app/views/questions create app/views/questions/index.html.erb create app/views/questions/result.html.erb ࡞੒ͨ͠QuestionsController ͔Βఆٛͨ͠ϞσϧΛ৮Δ

Slide 32

Slide 32 text

ϧʔςΟϯάΛఆٛ # config/routes.rb Rails.application.routes.draw do get 'questions/index' get 'questions/result' # For details on the DSL available within this file, see http:// guides.rubyonrails.org/routing.html end HTTPϦΫΤετͱControllerΛ݁Ϳ # config/routes.rb Rails.application.routes.draw do root to: 'questions#index' get :result, to: ‘questions#result’, as: :result end

Slide 33

Slide 33 text

ϧʔςΟϯάΛఆٛ http:/ /localhost:3000 ʹΞΫηε

Slide 34

Slide 34 text

ϧʔςΟϯάΛఆٛ http:/ /localhost:3000 QuestionsController ͷindexϝιου config/routes.rb app/views/questions/index.html.erb

Slide 35

Slide 35 text

ϧʔςΟϯάΛఆٛ ಉ༷ʹ http:/ /localhost:3000/result ʹΞΫηε

Slide 36

Slide 36 text

Controller͔Β࣭໰Λऔಘ # app/controllers/questions_controller.rb class QuestionsController < ApplicationController def index @questions = Question. all. order(:order_index) end def result end end ࣭໰(Question)Λશͯ(all)औಘͯ͠ɺ ॱ൪(order_index)Ͱฒͼସ͑Δ

Slide 37

Slide 37 text

औಘ࣭ͨ͠໰ΛViewͰදࣔ͢Δ http:/ /localhost:3000 QuestionsController ͷindexϝιου config/routes.rb app/views/questions/index.html.erb

Slide 38

Slide 38 text

औಘ࣭ͨ͠໰ΛViewͰදࣔ͢Δ # app/views/question.html.erb

Questions#index

Find me in app/views/questions/index.html.erb

<%- @questions.each do |question| %>

<%= question.content %>

    <%- question.choices.each do |choice| %>
  • <%= choice.content %>
  • <%- end %>
<%- end %>

Slide 39

Slide 39 text

औಘ࣭ͨ͠໰ΛViewͰදࣔ͢Δ http:/ /localhost:3000 ʹΞΫηε

Slide 40

Slide 40 text

αʔϏεͷྲྀΕ Ͳͷબ୒ࢶΛબΜ͔ͩ(Choice ID) Λαʔόʔʹૹͬͯܭࢉ͍ͨ͠

Slide 41

Slide 41 text

બΜͩબ୒ࢶΛαʔόʔʹૹΔ # app/views/question.html.erb <%= form_with url: result_path, local: true, method: :get do |f| %> <%- @questions.each do |question| %>

<%= question.content %>

<%- question.choices.each do |choice| %> <%= f.radio_button "choices[#{question.id}]", choice.id %> <%= choice.content %> <%- end %> <%- end %> <%= f.submit 'ճ౴' %> <% end %>

Slide 42

Slide 42 text

બΜͩબ୒ࢶΛαʔόʔʹૹΔ http:/ /localhost:3000 ʹΞΫηε

Slide 43

Slide 43 text

બΜͩબ୒ࢶΛαʔόʔʹૹΔ ## αʔόʔͷϩά web_1 | Processing by QuestionsController#result as HTML web_1 | Parameters: {"utf8"=>"✓", "choices"=>{"1"=>"1", "2"=>"6", "3"=>"10", "4"=>"16", "5"=>"20"}, "commit"=>"ճ౴"} web_1 | Rendering questions/result.html.erb within layouts/ application web_1 | Rendered questions/result.html.erb within layouts/ application (0.6ms) web_1 | Completed 200 OK in 252ms (Views: 218.3ms | ActiveRecord: 0.0ms) ͪΌΜͱૹΒΕͯͦ͏ id=1ͷ࣭໰ͷબ୒ࢶ͸id=1 id=2ͷ࣭໰ͷબ୒ࢶ͸id=6 …

Slide 44

Slide 44 text

બ୒ࢶ͔Β݁ՌΛܭࢉ ## αʔόʔͷϩά web_1 | Processing by QuestionsController#result as HTML web_1 | Parameters: {"utf8"=>"✓", "choices"=>{"1"=>"1", "2"=>"6", "3"=>"10", "4"=>"16", "5"=>"20"}, "commit"=>"ճ౴"} id=1, 6, 10, 16, 20ͷChoiceͷ attr_1, attr_2, attr_3, attr_4ͷ ͷ߹ܭ஋Λܭࢉ͢Δ Choiceςʔϒϧ RVFTUJPO@JE *OUFHFS DPOUFOU 4USJOH BUUS@ *OUFHFS BUUS@ *OUFHFS BUUS@ *OUFHFS BUUS@ *OUFHFS

Slide 45

Slide 45 text

બ୒ࢶ͔Β݁ՌΛܭࢉ # app/controllers/questions_controller.rb class QuestionsController < ApplicationController … def result choice_ids = params[:choices].values choices = Choice.where(id: choice_ids) @attr_1 = choices.sum(:attr_1) @attr_2 = choices.sum(:attr_2) @attr_3 = choices.sum(:attr_3) @attr_4 = choices.sum(:attr_4) end end GETύϥϝʔλ͔ΒChoiceͷIDҰཡΛऔಘ DB͔Βબ୒ࢶҰཡΛऔಘɺଐੑ஋Λܭࢉ

Slide 46

Slide 46 text

݁ՌΛදࣔͯ͠ΈΔ # app/views/result.html.erb

Questions#result

Find me in app/views/questions/result.html.erb

ଐੑ1ɿ <%= @attr_1 %>

ଐੑ2ɿ <%= @attr_2 %>

ଐੑ3ɿ <%= @attr_3 %>

ଐੑ4ɿ <%= @attr_4 %>

Slide 47

Slide 47 text

࣭໰Λม͑ͯΈΔ # db/fixtures/development/01_question.rb ##### Q.1 ##### Question.seed(:id) do |q| q.id = 1 q.order_index = 1 q.content = '΋͋͠ͳ͕ͨεʔύʔώʔϩʔͷੈքʹ͍Δͱͨ͠৔߹ɺͲΜͳεΩϧ͕ཉ͍͠Ͱ͔͢ʁ' end ##### Q.2 ##### Question.seed(:id) do |q| q.id = 2 q.order_index = 2 q.content = '΋͋͠ͳ͕ͨεϚϗήʔϜͰετϨεൃࢄΛ͢Δ৔߹ɺͲΜͳήʔϜΛબͼ·͔͢ʁ' end … $ dokcer-compose run web rails db:seed_fu

Slide 48

Slide 48 text

બ୒ࢶ΍ଐੑΛม͑ͯΈΔ # db/fixtures/development/02_choice.rb ##### Q.1 ͷબ୒ࢶ ##### Choice.seed(:question_id, :content) do |a| a.question_id = 1 a.content = 'ࣗ༝ࣗࡏʹม਎Ͱ͖ΔεΩϧ' a.attr_1, a.attr_2, a.attr_3, a.attr_4 = 1, 3, 5, 1 end Choice.seed(:question_id, :content) do |a| a.question_id = 1 a.content = 'εϐʔυઓಆೳྗͱߴ͍ӡಈεΩϧ' a.attr_1, a.attr_2, a.attr_3, a.attr_4 = 4, 3, 0, 1 end … ࠓճ͸͋͑ͯattr_1, …ͱந৅తͳΧϥϜΛ࢖༻ ͍ͯ͠ΔͷͰԿͱղऍͯ͠΋OK

Slide 49

Slide 49 text

࣭໰ɺબ୒ࢶΛ൓ө $ dokcer-compose run web rails db:seed_fu

Slide 50

Slide 50 text

݁ՌΛදࣔͯ͠ΈΔ # app/views/result.html.erb

Questions#result

Find me in app/views/questions/result.html.erb

ͣΔݡ͍ɿ <%= @attr_1 %>

಄೴໌᏷ɿ <%= @attr_2 %>

୯७ɿ <%= @attr_3 %>

ߦ͖౰ͨΓ͹ͬͨΓɿ <%= @attr_4 %>

Slide 51

Slide 51 text

ελΠϧΛ͋ͯΔ

Slide 52

Slide 52 text

Bulma࢖͍·͢ https:/ /bulma.io/

Slide 53

Slide 53 text

BulmaΛಋೖ https:/ /bulma.io/ # app/views/layouts/application.html.erb RailsAppForTechTrain <%= csrf_meta_tags %> <%= csp_meta_tag %> <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks- track': 'reload' %> <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %> <%= stylesheet_link_tag 'https://cdnjs.cloudflare.com/ajax/libs/bulma/0.7.4/ css/bulma.min.css' %> <%= yield %>

Slide 54

Slide 54 text

࣭໰ϖʔδͷσβΠϯมߋ # app/views/questions/index.html.erb
<%= form_with url: result_path, local: true, method: :get do |f| %> <%- @questions.each do |question| %>

<%= question.content %>

<%- question.choices.each do |choice| %> <%= f.radio_button "choices[#{question.id}]", choice.id %>
<%= choice.content %>
<%- end %> <%- end %> <%= f.submit 'ճ౴', class: "button is-primary" %> <% end %>

Slide 55

Slide 55 text

࣭໰ϖʔδͷσβΠϯมߋ # app/assets/stylesheets/questions.scss .choice { div { display: block; margin-bottom: 1rem; } &:hover div { opacity: .8; cursor: pointer; } input[type="radio"] { display: none; &:checked + div { background-color: #00d1b2; color: #fff; } } }

Slide 56

Slide 56 text

࣭໰ϖʔδͷσβΠϯมߋ

Slide 57

Slide 57 text

݁ՌϖʔδͷσβΠϯมߋ # app/views/questions/result.html.erb

ͣΔݡ͍

<%= @attr_1 %>

಄೴໌᏷

<%= @attr_2 %>

Slide 58

Slide 58 text

݁ՌϖʔδͷσβΠϯมߋ

Slide 59

Slide 59 text

݁ՌʹԠͯ͡ग़͠෼͚ # app/controllers/questions_controller.rb class QuestionsController < ApplicationController … def result … if @attr_1 > 10 && @attr_4 < 10 @recommend = 'υϥΰϯΫΤετVIII ۭͱւͱେ஍ͱढΘΕ͠ඣ܅' elsif … @recommend = ‘τϧωίͷେ๯ݥ ෆࢥٞͷμϯδϣϯ' … @recommend = ‘υϥΫΤ2 Ϛϧλͷ;͗͠ͳ伴 ϧΧͷཱཱྀͪ’ end end end

Slide 60

Slide 60 text

݁ՌʹԠͯ͡ग़͠෼͚ # app/views/questions/result.html.erb
͋ͳͨ͸ ʮ<%= @recommend %>ʯ ͕޷͖Ͱ͠ΐ͏ɻ

Slide 61

Slide 61 text

݁ՌʹԠͯ͡ग़͠෼͚

Slide 62

Slide 62 text

޷͖ʹΧελϚΠζͯ͠ΈΑ͏ʂ

Slide 63

Slide 63 text

վળҊ • ճ౴Λબ୒͠ͳͯ͘΋ʮճ౴ʯͰ͖ͯ͠·͏ • ݁ՌURL͕ृ͍ • ΦλΫλΠϓ਍அΈ͍ͨʹεϥΠυܗࣜͷճ౴ํ๏ • ࣭໰΍બ୒ࢶʹը૾Λ࢖͑ΔΑ͏ʹͯ͠ΈΔ • ࣭໰΍݁ՌΛ໘ന͘ʂ͜ΜͳΜͰ΋ϋϚΕ͹όζΔՄೳ ੑ͸͋Δ • ௒͔͍͍ͬ͜JSϥΠϒϥϦͰ݁ՌΛັͤΔ

Slide 64

Slide 64 text

͍͞͝ɿ࣮ӡ༻ʹΉ͚ͯ

Slide 65

Slide 65 text

ࠓճͷςʔϒϧઃܭ Questionςʔϒϧ DPOUFOU 4USJOH PSEFS@JOEFY *OUFHFS Choiceςʔϒϧ RVFTUJPO@JE *OUFHFS DPOUFOU 4USJOH BUUS@ *OUFHFS BUUS@ *OUFHFS BUUS@ *OUFHFS BUUS@ *OUFHFS ※ ͜Ε͸ϕετϓϥΫςΟεͰ͸ͳ͍ 1 N

Slide 66

Slide 66 text

ͨͱ͑͹… Questionςʔϒϧ DPOUFOU 5FYU PSEFS@JOEFY *OUFHFS JNBHF 4USJOH Choiceςʔϒϧ RVFTUJPO@JE *OUFHFS DPOUFOU 4USJOH JNBHF 4USJOH ChoiceͱAttributeΛଟରଟͷؔ܎ʹ͢Δͱεέʔϥϒϧ 1 N Attributeςʔϒϧ OBNF 4USJOH Choice-Attribute ςʔϒϧ RVFTUJPO@JE *OUFHFS BUUS@JE *OUFHFS QPJOU *OUFHFS 1 N 1 N N M

Slide 67

Slide 67 text

݁ՌURL͕ෳࡶ ௿஗Ԇɾ௿௨৴ྔɾߴը࣭ͷόʔνϟϧϥΠϒ഑৴ΞϓϦ • ݁ՌURL͔ΒԿΛબ୒͔ͨ͠ਪଌͰ͖ͯ͠·͏ • URL͕௕͗ͯ͢TwitterͰγΣΞͰ͖ͳ͍ • ී௨ʹΈͬͱ΋ͳ͍ →ɹ݁ՌΛ୹ॖURLԽʢgem ‘shortener’ ͳͲʣ

Slide 68

Slide 68 text

਍அ͍ͯ͠ΔײΛग़͢ • ΦλΫλΠϓ਍அͰ͸ճ౴݁Ռͷଐੑ஋Λ΋ͱ ʹɺ͓͢͢ΊͷϥΠόʔΛϨίϝϯυ • ஗͘͸ͳ͍͕ૣ͘΋ͳ͍ॲཧ • ૣ͗͢Δ਍அ͸Ϣʔβʔʹͱͬͯջٙత • ͋͑ͯগ͠଴ͨͤΔ

Slide 69

Slide 69 text

ݕূ؀ڥͷ༻ҙ • ΤϯδχΞҎ֎͕ӡ༻Ͱ͖Δ؀ڥΛ੔͑Δ • Herokuͩͱεςʔδϯά؀ڥ΋؆୯ʹ༻ҙͰ͖Δ • ϨίϝϯυΞϧΰϦζϜͷݕূ؀ڥ΋༻ҙ • 100ສճͷϥϯμϜճ౴Λߦͳ͓ͬͯ͢͢Ί͞ ΕΔϥΠόʔͷग़ݱස౓ΛՄࢹԽ • όʔδϣϯͷ֓೦Λ༻ҙ

Slide 70

Slide 70 text

͍͞͝ʹ ௿஗Ԇɾ௿௨৴ྔɾߴը࣭ͷόʔνϟϧϥΠϒ഑৴ΞϓϦ • ͜ΜͳγϯϓϧͳϛχΞϓϦͰ΋ͦΕͬΆ͘ ͳΔ • ։ൃͯࣗ͠෼͕ӡ༻Ͱ͖ΔͰ͸ෆे෼ • ࣗ෼͕໌೔͍ͳ͘ͳͬͯ΋ӡ༻Ͱ͖Δମ੍ Λ࡞Δ·Ͱ͕։ൃʢ୯ൃΞϓϦͷ৔߹͸ʣ

Slide 71

Slide 71 text

͋Γ͕ͱ͏͍͟͝·ͨ͠!