Slide 1

Slide 1 text

No content

Slide 2

Slide 2 text

begin

Slide 3

Slide 3 text

amatsuda/kaminari

Slide 4

Slide 4 text

͜Ε͸Կʁ Ruby on RailsͰ ϖʔδωʔγϣϯ͢Δ΍ͭ

Slide 5

Slide 5 text

Ͱ͖Δ͜ͱ ☇DBΫΤϦ΁ͷϖʔδ൪߸ͱ 1ϖʔδ͋ͨΓ݅਺ʹΑΔ ৚݅௥Ճ ☇ϖʔδωʔγϣϯϦϯΫͷ ඳը

Slide 6

Slide 6 text

ྺ࢙ ☇1st commit: 2011/02/05 ☇1st release: 2011/02/05

Slide 7

Slide 7 text

Railsͷϖʔδϟʔͷมભ ☇Rails 1.x: ඪ४ఴ෇࣌୅ ☇ActionController::Pagination ☇Rails 2.x: ໺ྑϓϥάΠϯ࣌୅ ☇classic_pagination ☇will_paginate ☇paginating_ nd

Slide 8

Slide 8 text

AC::Pagination ☇Railsඪ४ఴ෇ (ͦΜͳ࣌୅΋ ͋Γ·ͨ͠Ͷ) ☇࢖͍ํ͕೉ͯ͘͠ͳ͔ͳ͔ ֮͑ΒΕͳ͍ ☇஗͍͜ͱͰఆධ

Slide 9

Slide 9 text

AC::Pagination

Slide 10

Slide 10 text

"Automatic pagination for every action in a controller" class PersonController < ApplicationController model :person paginate :people, :order => 'last_name, rst_name', :per_page => 20 # ... end

Slide 11

Slide 11 text

AC::Pagination ☇φκͷએݴతDSL

Slide 12

Slide 12 text

"Pagination for a single action" def list @person_pages, @people = paginate :people, :order => 'last_name, rst_name' end

Slide 13

Slide 13 text

AC::Pagination ☇ϦϯΫඳը༻ͷΦϒδΣΫτ ͱݕࡧ݁Ռͷ഑ྻͷ2ͭͷΦϒ δΣΫτΛฦ͢API

Slide 14

Slide 14 text

AC::Paginationͷઃܭࢥ૝ ☇ϖʔδωʔγϣϯ͸ ίϯτϩʔϥʔͷ੹຿Ͱ͋Δ

Slide 15

Slide 15 text

will_paginateͷొ৔ “I WILL PAGINATE” http://errtheblog.com/posts/47- i-will-paginate

Slide 16

Slide 16 text

will_paginate ☇PJ & defunkt

Slide 17

Slide 17 text

PHPͷΠέͯΔ΍͔ͭΒύΫͬͨ ☇"Rails pagination code is really bad" ☇"stealing some PHP code" ☇"I nd Digg-style Pagination" ☇"you take 120 lines of PHP and slim it down to around 40 in Ruby"

Slide 18

Slide 18 text

will_paginateͷઃܭࢥ૝ ϖʔδωʔγϣϯ͸ ίϯτϩʔϥʔ͚ͩͷ੹຿ Ͱ͸ͳ͍ͷͰ͸ʁ

Slide 19

Slide 19 text

࠷ॳظͷREADMEΑΓ Quick quiz: Where does pagination logic belong? a) in the model; b) in the controller; c) in views; d) all of the above.

Slide 20

Slide 20 text

ARϞσϧʹpaginateϝιου @posts = Post.paginate :page => params[:page], :per_page => 50

Slide 21

Slide 21 text

ϏϡʔͰ͸͜ͷݕࡧ݁ՌΦϒδΣΫτ ͕ϦϯΫͷඳըʹ࢖ΘΕΔ <%= will_paginate @posts %>

Slide 22

Slide 22 text

will_paginateͷ࢖͍উख ݕࡧ͸ϞσϧͰɺσʔλͷड͚ ౉͠͸1ݸͷΦϒδΣΫτͰɺ ϦϯΫͷඳը͸Ϗϡʔͷ ϔϧύʔϝιουͰɺͱ੹຿Λ ෼͚ͨ͜ͱʹΑΓɺγϯϓϧͳ APIΛ࣮ݱ

Slide 23

Slide 23 text

will_paginateͷઃܭࢥ૝ ϖʔδωʔγϣϯ͸ M, V, CͷશͯʹؔΘΔ

Slide 24

Slide 24 text

will_paginateͷ࢖͍উख (2) φϏήʔγϣϯϦϯΫ͸Ruby Ͱॻ͔Εͨϔϧύʔϝιουͷ தͰจࣈྻΛ૊ཱͯͯΔͷͰɺ ඇৗʹΧελϚΠζ͕͠ʹ͘ ͍ɺͱ͍͏͔Ͱ͖ͳ͍

Slide 25

Slide 25 text

Railsͷϖʔδϟʔͷมભ ☇Rails 1.x: ඪ४ఴ෇࣌୅ ☇Rails 2.x: ໺ྑϓϥάΠϯ࣌୅ ☇Rails 3.0: Railsͷେվ଄ ☇Կ΋͔΋ಈ͔ͳ͘ͳͬͨ…

Slide 26

Slide 26 text

Rails 3.0࣌୅ ☇ Ralis 2.3 -> 3.0ͷϝδϟʔόʔδϣϯ ΞοϓͰRailsͷ಺෦ߏ଄͕େ͖͘มԽ ☇ Rails 2࣌୅ͷϓϥάΠϯ͕͍Ζ͍Ζࢮ๢ ☇ ۀ຿Ͱ։ൃ͍ͯͨ͠Rails 3.0ͷΞϓϦͰ ಈ࡞͢ΔϖʔδωʔγϣϯϥΠϒϥϦ͕ ͳ͔ͬͨ ☇ …ͷͰ͔ͨ͠ͳࣗ͘෼Ͱ࡞ͬͨ

Slide 27

Slide 27 text

ͳͥRails 2Ͱ࢖ͬͯͨطଘϥΠϒϥϦ ΁ͷύονʹ͠ͳ͔ͬͨͷ͔ʁ ☇๭will_p͕Ϋιίʔυ͗ͯ͢͜Ε ͍ͫΔͷϚδແཧͬͯࢥͬͨ ☇Rails 3ͷ৽ػೳͨͪΛ࢖ͬͨ ৽͍͠ΠσΟΦϜΛࢥ͍͍ͭͯ ͠·ͬͨ

Slide 28

Slide 28 text

Rails 3࣌୅ͷΠσΟΦϜ ☇RelationΛ͏·͘࢖͏ ☇Engineʹด͡ࠐΊΔ

Slide 29

Slide 29 text

࠷ॳظ࣮૷ ☇https://github.com/amatsuda/ kaminari/tree/v0.1.0

Slide 30

Slide 30 text

Ϟσϧଆͷ࣮૷

Slide 31

Slide 31 text

kaminari/active_record.rb (ൈਮ) kls.class_eval do scope :page, lambda {|num| offset(PER_PAGE * ([num.to_i, 1].max - 1)).limit(PER_PAGE) } do def per(num) offset(offset_value / limit_value * num).limit(num) end def num_pages (except(:offset, :limit).count.to_f / limit_value).ceil end def current_page (offset_value / limit_value) + 1 ennnnnnnd

Slide 32

Slide 32 text

Ϟσϧଆͷػೳ ☇ ARͷϞσϧͦΕͧΕʹରͯ͠page ͱ͍͏໊લͷscopeΛఆٛ ☇ pageͰ͸limitͱoffsetͷ஋Λࢉग़ͯ͠ ΫΤϦΛ૊ΈཱͯΔ ☇ page͸perͱ͔current_pageͱ͔ͷϝ ιου͕ੜ͑ͨ݁ՌΦϒδΣΫτΛฦ͢

Slide 33

Slide 33 text

͜ΜͳAPI

Slide 34

Slide 34 text

ϖʔδ൪߸ʹΑΔߜΓࠐΈ User.page(7)

Slide 35

Slide 35 text

1ϖʔδ͋ͨΓͷ݅਺ͷࢦఆ User.page(7).per(50)

Slide 36

Slide 36 text

ϖʔδωʔγϣϯϦϯΫͷඳը

Slide 37

Slide 37 text

ඞཁͳ৘ใ ☇૯݅਺ ☇1ϖʔδ͋ͨΓͷ݅਺ ☇ݱࡏͷϖʔδ൪߸

Slide 38

Slide 38 text

ಋग़Ͱ͖Δ৘ใ ☇૯ϖʔδ਺ ☇࠷ॳͷϖʔδ ☇࠷ޙͷϖʔδ ☇લͷϖʔδ ☇࣍ͷϖʔδ

Slide 39

Slide 39 text

Ϗϡʔଆͷ࣮૷ ☇Rails Enginesͷ࢓૊ΈΛར༻

Slide 40

Slide 40 text

Rails Engines ☇Rails 3Ͱಋೖ͞Εͨ৽ػೳ ☇Ϟσϧͱ͔ίϯτϩʔϥʔͱ͔ Ϗϡʔͱ͔con gͱ͔ΛؚΉ͜ͱ ͕Ͱ͖ΔϛχRailsΞϓϦΈ͍ͨ ͳ΋ͷΛ਌ΞϓϦʹόϯυϧ ͢Δ࢓૊Έ

Slide 41

Slide 41 text

Ϗϡʔଆͷ࣮૷ % ls app/views/kaminari _current_page.html.erb _ rst_page_link.html.erb _last_page_link.html.erb _next_link.html.erb _next_span.html.erb _page_link.html.erb _prev_link.html.erb _prev_span.html.erb _truncated_span.html.erb

Slide 42

Slide 42 text

Ϗϡʔଆͷ࣮૷ ☇ ଟ਺ͷpartialςϯϓϨʔτʹখ෼͚ ͞ΕͨERB (Ruby͕ຒΊࠐΊΔHTML ςϯϓϨʔτ) ☇ ϦϯΫΛΧελϚΠζ͍ͨ͠৔߹͸ partialΛॻ͖׵͑Ε͹ྑ͍ ☇ ैདྷͷϥΠϒϥϦͰෆຬͩͬͨϏϡʔͷ ΧελϚΠζੑͷѱ͞Λվྑͯ͠Έͨ

Slide 43

Slide 43 text

ϦϯΫ ☇ ࣍ͷϖʔδɺલͷϖʔδɺ࠷ॳͷϖʔ δɺ࠷ޙͷϖʔδɺ͋ͱϖʔδ൪߸ͷ ਺ࣈ ☇ ભҠઌͷϖʔδ൪߸ΛΫΤϦύϥϝʔ λʔʹ෇Ճͭͭ͠GETͰݱࡏϖʔδʹ ભҠ ☇ AjaxରԠ

Slide 44

Slide 44 text

Dave Thomasʹ๙ΊΒΕͨʂ

Slide 45

Slide 45 text

the admin side of our store our store == pragprog.com? (!!!)

Slide 46

Slide 46 text

ͦͷଞͷಛ௃ ☇ArrayͳͲΛԚછ͠ͳ͍ ☇ແઃఆͰ࢖͑Δ ☇Agnostic

Slide 47

Slide 47 text

Agnosticͱ͸ ☇Rails 3+ͷಛ௃ ☇Framework agnosticɹ ☇͍ΖΜͳϥΠϒϥϦͱ͔ʹ ରԠͯ͠ΔΑ͍ͬͯ͏͜ͱ ☇Kaminariʹ΋Өڹ

Slide 48

Slide 48 text

͍ΖΜͳϥΠϒϥϦʹରԠ ☇DataMapperͱ͔Mongoͱ͔ Sinatraͱ͔࢖ͬͯΔਓ͔Β ͍Ζ͍Ζ΀ΔΓ͕དྷΔ ☇ΦϨAR͔͠࢖ͬͯͳ͍Μ ͚ͩͲ…

Slide 49

Slide 49 text

Agnostic ☇Α͘Θ͔Μͳ͍͚Ͳɺಈ͍ͯͦ͏ ͩͬͨΒདྷͨ΋ͷ͸શͯऔΓࠐΜͰ Έͨ ☇࢓༷ͷංେԽ ☇=> ϝϯςͭΒ͍… ☇=> CIʹ͍͔͔ͬ࣌ؒ͢͝Δ

Slide 50

Slide 50 text

ݱࡏ࣮ߦ͞Ε͍ͯΔCI ☇Ruby 1.8.7, 1.9.3, 2.0.0, 2.1, ruby- head, jruby, rbx-2 ☇ActiveRecord 30, 31, 32, 40, 41, edge, DataMapper 12, MongoMapper, Mongoid 24, 30, 31, 40 ☇Rails֤όʔδϣϯ, Sinatra 13, 14

Slide 51

Slide 51 text

ݱࡏ࣮ߦ͞Ε͍ͯΔCI …ͷϚτϦοΫε

Slide 52

Slide 52 text

Sinatraͱ͔શ͘࢖ͬͯͳ͍͔ ΒͲ͏Ͱ΋͍͍Μ͚ͩͲ…

Slide 53

Slide 53 text

Sinatraͱ͔શ͘࢖ͬͯͳ͍͔ΒͲ͏Ͱ ΋͍͍Μ͚ͩͲ… Sinatraαϙʔτͯͯ͠ Α͔ͬͨ͜ͱ

Slide 54

Slide 54 text

No content

Slide 55

Slide 55 text

No content

Slide 56

Slide 56 text

͜Ε͔Β ☇Sinatraͱ͔DataMapperͱ͔ mongoͳΜͱ͔ͱ͔ͷΞμϓ λʔΛผϥΠϒϥϦʹ෼཭ ☇όʔδϣϯ൪߸Λ1.0ʹ͢Δ ☇Coming soon!

Slide 57

Slide 57 text

end