rails gems realize restful modeling patterns

74
Rails Gems realize RESTful modeling patterns @tkawa RubyKaigi 2013, June 1

Upload: toru-kawamura

Post on 10-May-2015

5.080 views

Category:

Technology


0 download

DESCRIPTION

RubyKaigi 2013 http://www.ustream.tv/recorded/33609885 (ja)

TRANSCRIPT

Page 1: Rails Gems realize RESTful modeling patterns

Rails Gems realize RESTful modeling patterns@tkawaRubyKaigi 2013, June 1

Page 2: Rails Gems realize RESTful modeling patterns

@tkawa

Ruby programmer (2000-)*RESTafarian (2005-) inspired by @yohei

Rails programmer (2006-)*Sendagaya.rb (2012-)

Toru KAWAMURA

* with some blank of career

Page 3: Rails Gems realize RESTful modeling patterns

Sendagaya.rb 『千駄ヶ谷.rb』Every Monday 19:00 - 21:30

Page 4: Rails Gems realize RESTful modeling patterns

Sendagaya.rb

Organized by @ppworks, @fukajun, and me

Concept: Looking forward to the weekly meetup makes our everyday working fun

Held currently at Shinjuku(!?), formerly at Sendagaya

#50 anniversary on June 3!

sendagayarb.github.io

Page 5: Rails Gems realize RESTful modeling patterns

Rails Gems realize RESTful modeling patterns@tkawa

Page 6: Rails Gems realize RESTful modeling patterns

Rails Gems realize RESTful resource modeling patterns@tkawa

Page 7: Rails Gems realize RESTful modeling patterns

Point of Departure

Page 8: Rails Gems realize RESTful modeling patterns

Rails is RESTful

Page 9: Rails Gems realize RESTful modeling patterns

Since RubyKaigi 2006June 11, 2006

Page 10: Rails Gems realize RESTful modeling patterns

# config/routes.rbFoobar::Application.routes.draw do resources :usersend

Page 11: Rails Gems realize RESTful modeling patterns

resources :users

Page 12: Rails Gems realize RESTful modeling patterns

GET /users users#indexPOST /users users#createGET /users/new users#newGET /users/:id/edit users#editGET /users/:id users#showPUT /users/:id users#updateDELETE /users/:id users#destroy

$ rake routes

Page 13: Rails Gems realize RESTful modeling patterns

GET POST PUT DELETE

/users index create - -

/users/:id show - update destroy

in addition, “new” and “edit” as supplementary resources

Page 14: Rails Gems realize RESTful modeling patterns

resources :users

That’s it.That makes for really simple design.

Page 15: Rails Gems realize RESTful modeling patterns

REST’s advantage is...

Page 16: Rails Gems realize RESTful modeling patterns

SimpleConsistentTo reap the benefits of HTTP (“HTTP way”)

Generally:

Page 17: Rails Gems realize RESTful modeling patterns

Easy to designEasy to understand

On Rails “resources” particularly:

Page 18: Rails Gems realize RESTful modeling patterns

“resources” makes iteasy to design

For developer him/herself“resources” decides on a resource form

All you have to do is to decide on a resource name, such as “users”

/user/1 /users/1 /users/user/1 /users/user-1

Page 19: Rails Gems realize RESTful modeling patterns

“resources” makes iteasy to understand

For developer him/herself, co-developer, and external developer (e.g. using API)Suggest that there are corresponding controller, model, view, etc, such as UsersController, User model

Page 20: Rails Gems realize RESTful modeling patterns

“resources” makes iteasy to design & understand

Rails has demonstrated thatthis simplicity goes well“Constraints are liberating”

Page 21: Rails Gems realize RESTful modeling patterns

You might think it does not go well in these cases:

Page 22: Rails Gems realize RESTful modeling patterns

AuthenticationSearchState changesExecution of procedural operationOperation to a list / SortWizard / Confirmation page

Page 23: Rails Gems realize RESTful modeling patterns

AuthenticationSearchState changesExecution of procedural operationOperation to a list / SortWizard / Confirmation page

How do I write routes.rb?

How about Controller? Model?

Page 24: Rails Gems realize RESTful modeling patterns

We need another technique.But...

Page 25: Rails Gems realize RESTful modeling patterns

resources :users

Page 26: Rails Gems realize RESTful modeling patterns

GET POST PUT DELETE

/users index create - -

/users/:id show - update destroy

in addition, “new” and “edit” as supplementary resources

Page 27: Rails Gems realize RESTful modeling patterns

GET POST PUT DELETE

/users index create - -

/users/:id show - update destroy

This is a pattern

Page 28: Rails Gems realize RESTful modeling patterns

“resources” makes iteasy to design & understand

Page 29: Rails Gems realize RESTful modeling patterns

A pattern makes iteasy to design & understand

Page 30: Rails Gems realize RESTful modeling patterns

“resources” is the fundamental pattern

If there is a smaller and more concrete pattern, we can design well accordingly

We want more (concrete) patterns!

Page 31: Rails Gems realize RESTful modeling patterns

コストがかかるかもしれない問題解決を実際に行う前の先行調査として大変役に立つ

パターンには名前がついていることが重要である。なぜなら、名前がついていることで問題や解決策を記述したり、会話の中で取り上げたりすることができるようになるからである

ja.wikipedia.org/wiki/デザインパターン_(ソフトウェア)

A pattern is not a wild card, but a card with many benefits

Page 32: Rails Gems realize RESTful modeling patterns

Using a pattern is similar to Rails way, and...

Page 33: Rails Gems realize RESTful modeling patterns

We have “RubyGems”

Page 34: Rails Gems realize RESTful modeling patterns

Suppose a gem provides the implementation of a specific pattern

Then routes.rb will be the description of the patterns to be used

Page 35: Rails Gems realize RESTful modeling patterns

Discover the pattern from RubyGems

Page 36: Rails Gems realize RESTful modeling patterns

AuthenticationSearchState changesExecution of procedural operationOperation to a list / SortWizard / Confirmation page

Page 37: Rails Gems realize RESTful modeling patterns

Authentication

“Sign in” / “Sign out”Those are represented as what?

Page 38: Rails Gems realize RESTful modeling patterns

devise.plataformatec.com.br

Deviseby Plataformatec

Page 39: Rails Gems realize RESTful modeling patterns

GET /users/sign_in devise/sessions#newPOST /users/sign_in devise/sessions#createDELETE /users/sign_out devise/sessions#destroy…

# config/routes.rbdevise_for :users

Page 40: Rails Gems realize RESTful modeling patterns

“Sessions” is a resource(that doesn’t involve a model)

GET /users/sign_in devise/sessions#newPOST /users/sign_in devise/sessions#createDELETE /users/sign_out devise/sessions#destroy…

# config/routes.rbdevise_for :users

Page 41: Rails Gems realize RESTful modeling patterns

Session is singular

Only one “authentication session” for each user

Page 42: Rails Gems realize RESTful modeling patterns

Session Resource patternProposal

GET /sessionPUT(POST) /session →sign inDELETE /session →sign out

rest-pattern.hatenablog.com/entry/session-resource

Page 43: Rails Gems realize RESTful modeling patterns

Singular resource in Rails

resources :usersresource :user

Page 44: Rails Gems realize RESTful modeling patterns

resource :session

Page 45: Rails Gems realize RESTful modeling patterns

POST /session sessions#createGET /session/new sessions#newGET /session/edit sessions#editGET /session sessions#showPUT /session sessions#updateDELETE /session sessions#destroy

$ rake routes

Page 46: Rails Gems realize RESTful modeling patterns

GET POST PUT DELETE

/session show create update destroy

in addition, “new” and “edit” as supplementary resources

Page 47: Rails Gems realize RESTful modeling patterns

GET POST PUT DELETE

/session show create update destroyThis is also a pattern

Page 48: Rails Gems realize RESTful modeling patterns

Authlogic

github.com/binarylogic/authlogic

by Ben Johnson of Binary Logic

Page 49: Rails Gems realize RESTful modeling patterns

# app/models/session.rbclass Session < Authlogic::Session::Baseend

Page 50: Rails Gems realize RESTful modeling patterns

# app/models/session.rbclass Session < Authlogic::Session::Baseend

If they have no model, let them create it.(not an ActiveRecord)

Page 51: Rails Gems realize RESTful modeling patterns

# app/controllers/sessions_controler.rbclass SessionsController < ApplicationController # POST /session def create @session = Session.new(session_params) if @session.save flash[:notice] = "Login successful!" redirect_back_or_default account_url else render :action => :new end endend

Page 52: Rails Gems realize RESTful modeling patterns

resource :session

Rails way!!

Page 53: Rails Gems realize RESTful modeling patterns

I wish Devise were like that...I’m planning to do this...

Page 54: Rails Gems realize RESTful modeling patterns

AuthenticationSearchState changesExecution of procedural operationOperation to a list / SortWizard / Confirmation page

Page 55: Rails Gems realize RESTful modeling patterns

Search

Search for users with the name that contains “tkawa”Search for users that were created before 2012

Page 56: Rails Gems realize RESTful modeling patterns

Ransack

github.com/ernie/ransack

by Ernie Miller

Page 57: Rails Gems realize RESTful modeling patterns

GET /users?q[name_cont]=tkawaGET /users?q[created_at_lt]=2013-01-01

Page 58: Rails Gems realize RESTful modeling patterns

Search from collection= Filtering

Page 59: Rails Gems realize RESTful modeling patterns

Filtered Collection patternProposal

/users?role=admin/users?since_id=123/users?page=2

rest-pattern.hatenablog.com/entry/filtered-collection

Page 60: Rails Gems realize RESTful modeling patterns

Kaminari

github.com/amatsuda/kaminari

by Akira Matsuda

GET /users?page=2&per=10

Page 61: Rails Gems realize RESTful modeling patterns

I wish I could use query parameters like models (w/ validation)...

Page 62: Rails Gems realize RESTful modeling patterns

class PostsController < ApplicationController private def filter_params # using strong parameters @_filter_params ||= begin params.default( # you can set default value per: '10' ).permit( :date, :q, :page, :per ).validate( # you can validate like a model date: { format: /\A\d{4}-\d{2}-\d{2}\Z/ }, q: { length: { maximum: 20 } } ) end end helper_method :filter_paramsend

github.com/tkawa/collection_filter

Query parameters like models

Page 63: Rails Gems realize RESTful modeling patterns

AuthenticationSearchState changesExecution of procedural operationOperation to a list / SortWizard / Confirmation page

Page 64: Rails Gems realize RESTful modeling patterns

Wizard

Enter data in multiple steps with page transitions

Page 65: Rails Gems realize RESTful modeling patterns

Wickedby Richard Schneeman

github.com/schneems/wicked

Page 66: Rails Gems realize RESTful modeling patterns

GET /user_steps/personalPUT /user_steps/personalGET /user_steps/socialPUT /user_steps/socialGET /user_steps/finish

Page 67: Rails Gems realize RESTful modeling patterns

Partial Resource patternProposal

/users/1/personal/users/1/name,email/users/1?fields=name,email

rest-pattern.hatenablog.com/entry/partial-resource

Provides only some attributes (fields)to GET/PUT

Page 68: Rails Gems realize RESTful modeling patterns

Transaction Resource patternProposal

POST /transactionsPUT /transactions/123PUT /transactions/123/committed

rest-pattern.hatenablog.com/entry/transaction-resource

Page 70: Rails Gems realize RESTful modeling patterns

Conclusion

Page 71: Rails Gems realize RESTful modeling patterns

RESTful patterns including “resources” are significant

Focusing on these patterns encourages good resource design

RubyGems are also useful for this purpose

Page 72: Rails Gems realize RESTful modeling patterns

If you are at a loss on resource modeling...

Focus on gems’ pattern

You will come up with the right resource by referring to the design of a good gem

“resources” is fundamental

Diverging from the “resources” is the last resort

Page 73: Rails Gems realize RESTful modeling patterns

If you are creating a gem...

You should consider designing around resources, if possibleLet's stick to the fundamentals of “resources”And your gem will realize a pattern!

Page 74: Rails Gems realize RESTful modeling patterns

Thank you for your attention.

Let me know if you discover more patterns!

rest-pattern.hatenablog.com