SlideShare une entreprise Scribd logo
1  sur  168
Télécharger pour lire hors ligne
Pragmatic Patterns
 of Ruby on Rails




Yasuko OHBA(     )
what I do


• developer of Rails applications
•
• Everyleaf Corporation
sponsor booth

• first time to be a sponsor
•   we serve candies

• you can play ‘Romantic Ruby’ !
my products


• home accounting web service
    http://www.kozuchi.net
•   http://github.com/everyleaf/kozuchi/
    tree
personal message
I started
programming when I
  was 14 years old
school for girls
I was alone
got the job
find similar people
however
‘enterprise’
only activities
inside the company
other things
 mount up
I was lost
want to write codes
that’s when..
Ruby was given
life becomes happier
Ruby for enterprises
the way to live
happily writing codes
And...
great communities
many friends
thank you !!
today’s presentation
coding patterns
     with
 Ruby on Rails
the target


• large & complicated applications
•   team
problems of large
        applications

• different coding styles
•   nasty parts made
becomes harder
to maintenance
keep your codes
      nice
what is the ‘nice code’?

• good design
• easy to understand
• easy to find something wrong
coding patterns work fine



• make and share coding patterns
• add some DSL (not too much)
efficient, of course
what I won’t say


• how to get the best performance
• ActiveRecord’s alternatives
ActiveRecord
frankly speaking,
I love ActiveRecord
because
OOP
still able to maintenance
when it gets complicated
pragmatic
the heart of RoR
many AR features in
 this presentation
examples
show permitted data
find starts from
 an AR object
find a note by id


           /note/3
def show
 @note = Note.find(params[:id])
end
find a note of the current user



                /note/3
@note = Note.find_by_id_and_user_id(
  params[:id], current_user.id)
raise ActiveRecord::RecordNotFound unless @note
/note/3

@note = Note.written_by(
 curret_user.id).find(params[:id])
hard to notice
the luck of condition!


@note = Note.find(params[:id])
@note = Note.find_by_id_and_user_id(
  params[:id], current_user.id)
@note = Note.written_by(
  current_user).find(params[:id])
so,
find starts from
 an AR object
starts from an object


def show
 @note = current_user.notes.find(
    params[:id])
end
use the association


def show
 @note = current_user.notes.find(
    params[:id])
end
association


class User < ActiveRecord::Base
  has_many :notes
end
easy to notice problems


@note = current_user.notes.find(
  params[:id])

@note = Note.find(params[:id])
easy to see
who can access
who can access


@note =
current_user.notes.find(
  params[:id])
filters to find
the starting AR object
with the previous
     pattern
most actions will
use the AR object
example;
CRUD of the specified
   group’s notes
•                      URL


• /groups/15/notes
• /groups/15/notes/3
• Note has group_id
class Note < ActiveRecord::Base
  belongs_to :group
end
class Group < ActiveRecord::Base
  has_many :notes
end
def index
 @group = Group.find(params[:group_id])
 @notes = @group.notes.paginate(:page =>
                           params[:page])
end
def show
 @group = Group.find(params[:group_id])
 @note = @group.notes.find(params[:id])
end
the duplicated line



@group = Group.find(params[:group_id])
write that line
  in a filter
what’s the filter?

• the separated logic which would be
  called around action



• declarative
find the group in a filter

class GroupNotesController < ApplicationController
 before_filter :find_group
  .......actions ......
 private
 def find_group
  @group = Group.find(params[:group_id])
 end
end
DRY

before_filter :find_group
def index
 @notes = @group.notes.paginate(:page =>
                           params[:page])
end
def show
 @note = @group.notes.find(params[:id])
end
easy to change
access control
example; change to allow
 access to members only



def find_group
 @group = current_user.groups.find(
                  params[:group_id]
end
other merits
secure
safe if it starts from @group


def index
 @notes = @group.notes.paginate(:page =>
                           params[:page])
end
def show
 @note = @group.notes.find(params[:id])
end
filter urges developers
    to use @group
and
readable
you can understand
the controller’s summary
  from name and filters
understand the summary
           quickly



class GroupNotesController <
                   ApplicationController
  before_filter :find_group
the points

•   a good controller name

•   readable filters
complicated
business logics
want to write
business logics
  in models
because
merits of writing
    business logics in models


• easy to test
• easy to reuse
• readable, easy to find the target codes
however
‘how’ matters a lot
a bad example

class MyModel < ActiveRecord::Base
  def do_create(params)
    ....
  def do_destroy(params)
    ...
end
why is it bad ?


• it breaks MVC
• hard to reuse
now
let’s move codes
from controller to model
       in good way
move the logic
branching on parameters
      from C to M
branching on parameters

def update
 @note.attributes = params[:note]
 @tags = params[:auto_tagging] == '1' ?
     generate_tags(@note) : []

 # do saving and tagging
 ...
end
often written in
   controller
to move to model
add an attribute for
branching to the model
the condition



params[:auto_tagging] == '1'
as an attribute of the model



class Note < ActiveRecord::Base
  attr_accessor :auto_tagging

end
change parameters structure


 { :note => {.....}, :auto_tagging => '1' }



 { :note => { ....., :auto_tagging => '1' }}
change the view for it


<%= check_box_tag :auto_tagging %>



<% form_for :note, ... do |f |%>
 <%= f.check_box :auto_tagging %>
<% end %>
now it’s in params[:note]



def update
 @note.attributes = params[:note]
 if params[:auto_tagging] == '1'
    generate_tags(@note)
 end
 .....
can branch in the model

class Note < ActiveRecord::Base
  ....
  if auto_tagging
      ...
  end
end
finished to move
    branching
move generate_tags next
move the logic
processing other models
     from C to M
the logic
processing other models

def update
    generate_tags(@note)
end
private
def generate_tags(note)
 tags = Tag.extract(note.body)
 note.tag_list = tags.join(',')
end
also often written in
     controller
put it into model’s callback

  class Note < ActiveRecord::Base
    before_save :generate_taggings

   private
   def generate_taggings
    return unless auto_tagging
    tags = Tag.extract(body)
    self.tag_list = tags.join(',')
   end
  end
what’s the model’s callback?



• methods called before/after save or
  destroy
Rails               Model                You
                          normal method call



                   save
        (validation)

        before_save
   do saving

            after_save
self-directive
   models
now we’ve done it !


• easy to test
• easy to reuse
• readable, easy to find the target codes
other patterns

•   multi levels for validation

•   design & coding policy for STI

•   use owner object’s attributes in association

•   how to make routes.rb a little readable
the last topic
how to find
coding patterns
in my case
try to choose
the most natural style
       for RoR
what is the most
   natural way
in Ruby on Rails?
1. OOP
express business
logics as models
always think who
should do that job
Note or User ?

@note = Note.find_by_id_and_user_id(
  params[:id], current_user.id)


@note = current_user.notes.find(
  params[:id])
you can’t always
decide it from tables
decide it
in objects world
2. follow the
principles of RoR
principles of RoR


•   DRY
•   CoC
•   RESTful
accept RESTful
in Ruby on Rails
how to design
 controllers ?
one controller for
a type of resources
what’s the resources?
you can find it in URL



/companies/everyleaf/notes/3
design of controllers
starts from
design of URLs
roughly speaking,
Model Class

    1
        1..*

 Resource
the point is...
one controller should
provide one resource
    type’s CRUD
might have been derailed

class BlogsController < ApplicationController
 def create_comment
 end
 def comments
 end
 def destroy_comment
 ...
one more
write codes in model’s
    standard flows
standard flows


•   find
•   new → save (create)
•   find → save (update)
•   find → destroy
inside of a flow
new       attribute =    before_
 build                   validation



before_      after_      validation
  save     validation



creation
           after_save
write codes in
appropriate place
where, what
 new          attribute =    before_
 build                      validation



before_         after_      validation
  save        validation



creation
              after_save
try to choose
the most natural style
       for RoR
don’t go too far
from the basic styles
because
it’s normal to
Rails programmers
easy to read
for everyone
for that purpose
use Ruby’s flexibility
summary
in developing
large & complicated
      application
it’s important
to keep codes nice
for that purpose
be aware of coding
     patterns,
 and share them
coding patterns
fitting Ruby on Rails
make source codes
 easy to read for
general developers
it means
easy to maintain
thank you !

Contenu connexe

Tendances

Real-World Scala Design Patterns
Real-World Scala Design PatternsReal-World Scala Design Patterns
Real-World Scala Design PatternsNLJUG
 
What I Love About Ruby
What I Love About RubyWhat I Love About Ruby
What I Love About RubyKeith Bennett
 
OOP - Introduction to Inheritance
OOP - Introduction to InheritanceOOP - Introduction to Inheritance
OOP - Introduction to InheritanceMohammad Shaker
 
Java script Session No 1
Java script Session No 1Java script Session No 1
Java script Session No 1Saif Ullah Dar
 
Small Code - Ruby on Ales 2014
Small Code - Ruby on Ales 2014Small Code - Ruby on Ales 2014
Small Code - Ruby on Ales 2014Mark Menard
 
Let's Do Some Upfront Design - WindyCityRails 2014
Let's Do Some Upfront Design - WindyCityRails 2014Let's Do Some Upfront Design - WindyCityRails 2014
Let's Do Some Upfront Design - WindyCityRails 2014Mark Menard
 
Coding standards for java
Coding standards for javaCoding standards for java
Coding standards for javamaheshm1206
 
Efficient Rails Test Driven Development (class 3) by Wolfram Arnold
Efficient Rails Test Driven Development (class 3) by Wolfram ArnoldEfficient Rails Test Driven Development (class 3) by Wolfram Arnold
Efficient Rails Test Driven Development (class 3) by Wolfram ArnoldMarakana Inc.
 
Small Code - RailsConf 2014
Small Code - RailsConf 2014Small Code - RailsConf 2014
Small Code - RailsConf 2014Mark Menard
 
introduction to javascript
introduction to javascriptintroduction to javascript
introduction to javascriptKumar
 
Write Small Things (Code)
Write Small Things (Code)Write Small Things (Code)
Write Small Things (Code)Mark Menard
 

Tendances (15)

Real-World Scala Design Patterns
Real-World Scala Design PatternsReal-World Scala Design Patterns
Real-World Scala Design Patterns
 
Javanotes
JavanotesJavanotes
Javanotes
 
Ruby On Rails
Ruby On RailsRuby On Rails
Ruby On Rails
 
What I Love About Ruby
What I Love About RubyWhat I Love About Ruby
What I Love About Ruby
 
Scala’s implicits
Scala’s implicitsScala’s implicits
Scala’s implicits
 
OOP - Introduction to Inheritance
OOP - Introduction to InheritanceOOP - Introduction to Inheritance
OOP - Introduction to Inheritance
 
Java script
Java scriptJava script
Java script
 
Java script Session No 1
Java script Session No 1Java script Session No 1
Java script Session No 1
 
Small Code - Ruby on Ales 2014
Small Code - Ruby on Ales 2014Small Code - Ruby on Ales 2014
Small Code - Ruby on Ales 2014
 
Let's Do Some Upfront Design - WindyCityRails 2014
Let's Do Some Upfront Design - WindyCityRails 2014Let's Do Some Upfront Design - WindyCityRails 2014
Let's Do Some Upfront Design - WindyCityRails 2014
 
Coding standards for java
Coding standards for javaCoding standards for java
Coding standards for java
 
Efficient Rails Test Driven Development (class 3) by Wolfram Arnold
Efficient Rails Test Driven Development (class 3) by Wolfram ArnoldEfficient Rails Test Driven Development (class 3) by Wolfram Arnold
Efficient Rails Test Driven Development (class 3) by Wolfram Arnold
 
Small Code - RailsConf 2014
Small Code - RailsConf 2014Small Code - RailsConf 2014
Small Code - RailsConf 2014
 
introduction to javascript
introduction to javascriptintroduction to javascript
introduction to javascript
 
Write Small Things (Code)
Write Small Things (Code)Write Small Things (Code)
Write Small Things (Code)
 

En vedette

Good Names in Right Places on Rails
Good Names in Right Places on RailsGood Names in Right Places on Rails
Good Names in Right Places on RailsYasuko Ohba
 
TECH LAB PAAK 2015/06/24 Team Development
TECH LAB PAAK 2015/06/24 Team DevelopmentTECH LAB PAAK 2015/06/24 Team Development
TECH LAB PAAK 2015/06/24 Team DevelopmentYasuko Ohba
 
QCon2009 Tokyo - Ruby on Railsで変わるエンタープライズ開発の現場
QCon2009 Tokyo - Ruby on Railsで変わるエンタープライズ開発の現場QCon2009 Tokyo - Ruby on Railsで変わるエンタープライズ開発の現場
QCon2009 Tokyo - Ruby on Railsで変わるエンタープライズ開発の現場Yasuko Ohba
 
Rubyによる開発プロジェクトをうまく回すには(2)
Rubyによる開発プロジェクトをうまく回すには(2)Rubyによる開発プロジェクトをうまく回すには(2)
Rubyによる開発プロジェクトをうまく回すには(2)Yasuko Ohba
 
Rubyによる開発プロジェクトをうまく回すには(1)
Rubyによる開発プロジェクトをうまく回すには(1)Rubyによる開発プロジェクトをうまく回すには(1)
Rubyによる開発プロジェクトをうまく回すには(1)Yasuko Ohba
 
名前のつけ方
名前のつけ方名前のつけ方
名前のつけ方Yasuko Ohba
 
テスト大嫌いっ娘のRSpec
テスト大嫌いっ娘のRSpecテスト大嫌いっ娘のRSpec
テスト大嫌いっ娘のRSpecYasuko Ohba
 
Balonmán touro
Balonmán touroBalonmán touro
Balonmán tourodavidares1
 
AWSome Day Berlin 18.6.2014
AWSome Day Berlin 18.6.2014AWSome Day Berlin 18.6.2014
AWSome Day Berlin 18.6.2014tecRacer
 
モバイルとソーシャルによる「学びの進化」を考える
モバイルとソーシャルによる「学びの進化」を考えるモバイルとソーシャルによる「学びの進化」を考える
モバイルとソーシャルによる「学びの進化」を考えるwebcampusschoo
 
最高の自分に進化する方法【コンサル起業実践講座】
最高の自分に進化する方法【コンサル起業実践講座】最高の自分に進化する方法【コンサル起業実践講座】
最高の自分に進化する方法【コンサル起業実践講座】伊藤 剛志
 
Pirkanmaan toisen asteen tvt-suunnitelma ITK2014
Pirkanmaan toisen asteen tvt-suunnitelma ITK2014Pirkanmaan toisen asteen tvt-suunnitelma ITK2014
Pirkanmaan toisen asteen tvt-suunnitelma ITK2014Riikka Lehto (Vanninen)
 
Cognitive Biases: How the Clustering Illusion will impact your pitch
Cognitive Biases:  How the Clustering Illusion will impact your pitchCognitive Biases:  How the Clustering Illusion will impact your pitch
Cognitive Biases: How the Clustering Illusion will impact your pitchSiamac Rezaiezadeh
 
Unit 2: NUTRITION
Unit 2: NUTRITIONUnit 2: NUTRITION
Unit 2: NUTRITIONalfonsodios
 
Bahadur shah (son of king prithivinarayan)
Bahadur shah (son of king prithivinarayan)Bahadur shah (son of king prithivinarayan)
Bahadur shah (son of king prithivinarayan)Ramesh Pant
 

En vedette (20)

Good Names in Right Places on Rails
Good Names in Right Places on RailsGood Names in Right Places on Rails
Good Names in Right Places on Rails
 
TECH LAB PAAK 2015/06/24 Team Development
TECH LAB PAAK 2015/06/24 Team DevelopmentTECH LAB PAAK 2015/06/24 Team Development
TECH LAB PAAK 2015/06/24 Team Development
 
QCon2009 Tokyo - Ruby on Railsで変わるエンタープライズ開発の現場
QCon2009 Tokyo - Ruby on Railsで変わるエンタープライズ開発の現場QCon2009 Tokyo - Ruby on Railsで変わるエンタープライズ開発の現場
QCon2009 Tokyo - Ruby on Railsで変わるエンタープライズ開発の現場
 
Sendai ruby-02
Sendai ruby-02Sendai ruby-02
Sendai ruby-02
 
Rubyによる開発プロジェクトをうまく回すには(2)
Rubyによる開発プロジェクトをうまく回すには(2)Rubyによる開発プロジェクトをうまく回すには(2)
Rubyによる開発プロジェクトをうまく回すには(2)
 
Rubyによる開発プロジェクトをうまく回すには(1)
Rubyによる開発プロジェクトをうまく回すには(1)Rubyによる開発プロジェクトをうまく回すには(1)
Rubyによる開発プロジェクトをうまく回すには(1)
 
名前のつけ方
名前のつけ方名前のつけ方
名前のつけ方
 
テスト大嫌いっ娘のRSpec
テスト大嫌いっ娘のRSpecテスト大嫌いっ娘のRSpec
テスト大嫌いっ娘のRSpec
 
Shimane2010
Shimane2010Shimane2010
Shimane2010
 
Balonmán touro
Balonmán touroBalonmán touro
Balonmán touro
 
Open il vol4
Open il vol4Open il vol4
Open il vol4
 
AWSome Day Berlin 18.6.2014
AWSome Day Berlin 18.6.2014AWSome Day Berlin 18.6.2014
AWSome Day Berlin 18.6.2014
 
モバイルとソーシャルによる「学びの進化」を考える
モバイルとソーシャルによる「学びの進化」を考えるモバイルとソーシャルによる「学びの進化」を考える
モバイルとソーシャルによる「学びの進化」を考える
 
最高の自分に進化する方法【コンサル起業実践講座】
最高の自分に進化する方法【コンサル起業実践講座】最高の自分に進化する方法【コンサル起業実践講座】
最高の自分に進化する方法【コンサル起業実践講座】
 
driver
driverdriver
driver
 
J350 Social Media Intro
J350 Social Media IntroJ350 Social Media Intro
J350 Social Media Intro
 
Pirkanmaan toisen asteen tvt-suunnitelma ITK2014
Pirkanmaan toisen asteen tvt-suunnitelma ITK2014Pirkanmaan toisen asteen tvt-suunnitelma ITK2014
Pirkanmaan toisen asteen tvt-suunnitelma ITK2014
 
Cognitive Biases: How the Clustering Illusion will impact your pitch
Cognitive Biases:  How the Clustering Illusion will impact your pitchCognitive Biases:  How the Clustering Illusion will impact your pitch
Cognitive Biases: How the Clustering Illusion will impact your pitch
 
Unit 2: NUTRITION
Unit 2: NUTRITIONUnit 2: NUTRITION
Unit 2: NUTRITION
 
Bahadur shah (son of king prithivinarayan)
Bahadur shah (son of king prithivinarayan)Bahadur shah (son of king prithivinarayan)
Bahadur shah (son of king prithivinarayan)
 

Similaire à Pragmatic Patterns of Ruby on Rails - Ruby Kaigi2009

Rails antipattern-public
Rails antipattern-publicRails antipattern-public
Rails antipattern-publicChul Ju Hong
 
Rails antipatterns
Rails antipatternsRails antipatterns
Rails antipatternsChul Ju Hong
 
HES2011 - joernchen - Ruby on Rails from a Code Auditor Perspective
HES2011 - joernchen - Ruby on Rails from a Code Auditor PerspectiveHES2011 - joernchen - Ruby on Rails from a Code Auditor Perspective
HES2011 - joernchen - Ruby on Rails from a Code Auditor PerspectiveHackito Ergo Sum
 
Random Ruby Tips - Ruby Meetup 27 Jun 2018
Random Ruby Tips - Ruby Meetup 27 Jun 2018Random Ruby Tips - Ruby Meetup 27 Jun 2018
Random Ruby Tips - Ruby Meetup 27 Jun 2018Kenneth Teh
 
Writing Readable Code
Writing Readable CodeWriting Readable Code
Writing Readable Codeeddiehaber
 
Rails Tips and Best Practices
Rails Tips and Best PracticesRails Tips and Best Practices
Rails Tips and Best PracticesDavid Keener
 
Rspec and Capybara Intro Tutorial at RailsConf 2013
Rspec and Capybara Intro Tutorial at RailsConf 2013Rspec and Capybara Intro Tutorial at RailsConf 2013
Rspec and Capybara Intro Tutorial at RailsConf 2013Brian Sam-Bodden
 
RoR 101: Session 2
RoR 101: Session 2RoR 101: Session 2
RoR 101: Session 2Rory Gianni
 
2011-02-03 LA RubyConf Rails3 TDD Workshop
2011-02-03 LA RubyConf Rails3 TDD Workshop2011-02-03 LA RubyConf Rails3 TDD Workshop
2011-02-03 LA RubyConf Rails3 TDD WorkshopWolfram Arnold
 
Código Saudável => Programador Feliz - Rs on Rails 2010
Código Saudável => Programador Feliz - Rs on Rails 2010Código Saudável => Programador Feliz - Rs on Rails 2010
Código Saudável => Programador Feliz - Rs on Rails 2010Plataformatec
 
Jasig rubyon rails
Jasig rubyon railsJasig rubyon rails
Jasig rubyon rails_zaMmer_
 
Jasig rubyon rails
Jasig rubyon railsJasig rubyon rails
Jasig rubyon rails_zaMmer_
 
Intro to Rails ActiveRecord
Intro to Rails ActiveRecordIntro to Rails ActiveRecord
Intro to Rails ActiveRecordMark Menard
 
Intro to Ruby on Rails
Intro to Ruby on RailsIntro to Ruby on Rails
Intro to Ruby on RailsMark Menard
 
Web Development with Python and Django
Web Development with Python and DjangoWeb Development with Python and Django
Web Development with Python and DjangoMichael Pirnat
 
Ruby On Rails Introduction
Ruby On Rails IntroductionRuby On Rails Introduction
Ruby On Rails IntroductionThomas Fuchs
 
Namespace less engine
Namespace less engineNamespace less engine
Namespace less engineshaokun
 

Similaire à Pragmatic Patterns of Ruby on Rails - Ruby Kaigi2009 (20)

Rails antipattern-public
Rails antipattern-publicRails antipattern-public
Rails antipattern-public
 
Rails antipatterns
Rails antipatternsRails antipatterns
Rails antipatterns
 
HES2011 - joernchen - Ruby on Rails from a Code Auditor Perspective
HES2011 - joernchen - Ruby on Rails from a Code Auditor PerspectiveHES2011 - joernchen - Ruby on Rails from a Code Auditor Perspective
HES2011 - joernchen - Ruby on Rails from a Code Auditor Perspective
 
Random Ruby Tips - Ruby Meetup 27 Jun 2018
Random Ruby Tips - Ruby Meetup 27 Jun 2018Random Ruby Tips - Ruby Meetup 27 Jun 2018
Random Ruby Tips - Ruby Meetup 27 Jun 2018
 
Writing Readable Code
Writing Readable CodeWriting Readable Code
Writing Readable Code
 
Rails Tips and Best Practices
Rails Tips and Best PracticesRails Tips and Best Practices
Rails Tips and Best Practices
 
Rspec and Capybara Intro Tutorial at RailsConf 2013
Rspec and Capybara Intro Tutorial at RailsConf 2013Rspec and Capybara Intro Tutorial at RailsConf 2013
Rspec and Capybara Intro Tutorial at RailsConf 2013
 
RoR 101: Session 2
RoR 101: Session 2RoR 101: Session 2
RoR 101: Session 2
 
2011-02-03 LA RubyConf Rails3 TDD Workshop
2011-02-03 LA RubyConf Rails3 TDD Workshop2011-02-03 LA RubyConf Rails3 TDD Workshop
2011-02-03 LA RubyConf Rails3 TDD Workshop
 
Código Saudável => Programador Feliz - Rs on Rails 2010
Código Saudável => Programador Feliz - Rs on Rails 2010Código Saudável => Programador Feliz - Rs on Rails 2010
Código Saudável => Programador Feliz - Rs on Rails 2010
 
Intro to Rails 4
Intro to Rails 4Intro to Rails 4
Intro to Rails 4
 
Jasig rubyon rails
Jasig rubyon railsJasig rubyon rails
Jasig rubyon rails
 
Jasig rubyon rails
Jasig rubyon railsJasig rubyon rails
Jasig rubyon rails
 
Intro to Rails ActiveRecord
Intro to Rails ActiveRecordIntro to Rails ActiveRecord
Intro to Rails ActiveRecord
 
Intro to Ruby on Rails
Intro to Ruby on RailsIntro to Ruby on Rails
Intro to Ruby on Rails
 
Web Development with Python and Django
Web Development with Python and DjangoWeb Development with Python and Django
Web Development with Python and Django
 
Ruby On Rails Introduction
Ruby On Rails IntroductionRuby On Rails Introduction
Ruby On Rails Introduction
 
Ruby On Rails
Ruby On RailsRuby On Rails
Ruby On Rails
 
Coding conventions
Coding conventionsCoding conventions
Coding conventions
 
Namespace less engine
Namespace less engineNamespace less engine
Namespace less engine
 

Plus de Yasuko Ohba

女性IT技術者と働き方 情報処理学会77
女性IT技術者と働き方 情報処理学会77女性IT技術者と働き方 情報処理学会77
女性IT技術者と働き方 情報処理学会77Yasuko Ohba
 
Girl, Geek and Company - Tokyo Girl Geek Dinners #5 2013/7/5
Girl, Geek and Company - Tokyo Girl Geek Dinners #5 2013/7/5Girl, Geek and Company - Tokyo Girl Geek Dinners #5 2013/7/5
Girl, Geek and Company - Tokyo Girl Geek Dinners #5 2013/7/5Yasuko Ohba
 
世界を描く Drawing the world
世界を描く Drawing the world世界を描く Drawing the world
世界を描く Drawing the worldYasuko Ohba
 
ごきげんRails
ごきげんRailsごきげんRails
ごきげんRailsYasuko Ohba
 
Smell in Rails Apps (in Sapporo RubyKaigi03)
Smell in Rails Apps (in Sapporo RubyKaigi03)Smell in Rails Apps (in Sapporo RubyKaigi03)
Smell in Rails Apps (in Sapporo RubyKaigi03)Yasuko Ohba
 
The Basis of Making DSL with Ruby
The Basis of Making DSL with RubyThe Basis of Making DSL with Ruby
The Basis of Making DSL with RubyYasuko Ohba
 
Sub Resources Rails Plug-in
Sub Resources Rails Plug-inSub Resources Rails Plug-in
Sub Resources Rails Plug-inYasuko Ohba
 
More Pragmatic Patterns of Ruby on Rails at Kansai Ruby Kaigi #02
More Pragmatic Patterns of Ruby on Rails at Kansai Ruby Kaigi #02More Pragmatic Patterns of Ruby on Rails at Kansai Ruby Kaigi #02
More Pragmatic Patterns of Ruby on Rails at Kansai Ruby Kaigi #02Yasuko Ohba
 
Ruby on Rails 入門
Ruby on Rails 入門Ruby on Rails 入門
Ruby on Rails 入門Yasuko Ohba
 
image_upload Plugin 2007/12/7
image_upload Plugin 2007/12/7image_upload Plugin 2007/12/7
image_upload Plugin 2007/12/7Yasuko Ohba
 
Ruby on Rails ステップアップ講座 - 大場寧子
Ruby on Rails ステップアップ講座 - 大場寧子Ruby on Rails ステップアップ講座 - 大場寧子
Ruby on Rails ステップアップ講座 - 大場寧子Yasuko Ohba
 
Ruby on Rails 中級者を目指して - 大場寧子
Ruby on Rails 中級者を目指して - 大場寧子Ruby on Rails 中級者を目指して - 大場寧子
Ruby on Rails 中級者を目指して - 大場寧子Yasuko Ohba
 
Bookscope 2007 09 07
Bookscope 2007 09 07Bookscope 2007 09 07
Bookscope 2007 09 07Yasuko Ohba
 

Plus de Yasuko Ohba (15)

女性IT技術者と働き方 情報処理学会77
女性IT技術者と働き方 情報処理学会77女性IT技術者と働き方 情報処理学会77
女性IT技術者と働き方 情報処理学会77
 
Girl, Geek and Company - Tokyo Girl Geek Dinners #5 2013/7/5
Girl, Geek and Company - Tokyo Girl Geek Dinners #5 2013/7/5Girl, Geek and Company - Tokyo Girl Geek Dinners #5 2013/7/5
Girl, Geek and Company - Tokyo Girl Geek Dinners #5 2013/7/5
 
世界を描く Drawing the world
世界を描く Drawing the world世界を描く Drawing the world
世界を描く Drawing the world
 
ごきげんRails
ごきげんRailsごきげんRails
ごきげんRails
 
Smell in Rails Apps (in Sapporo RubyKaigi03)
Smell in Rails Apps (in Sapporo RubyKaigi03)Smell in Rails Apps (in Sapporo RubyKaigi03)
Smell in Rails Apps (in Sapporo RubyKaigi03)
 
The Basis of Making DSL with Ruby
The Basis of Making DSL with RubyThe Basis of Making DSL with Ruby
The Basis of Making DSL with Ruby
 
Sub Resources Rails Plug-in
Sub Resources Rails Plug-inSub Resources Rails Plug-in
Sub Resources Rails Plug-in
 
More Pragmatic Patterns of Ruby on Rails at Kansai Ruby Kaigi #02
More Pragmatic Patterns of Ruby on Rails at Kansai Ruby Kaigi #02More Pragmatic Patterns of Ruby on Rails at Kansai Ruby Kaigi #02
More Pragmatic Patterns of Ruby on Rails at Kansai Ruby Kaigi #02
 
Raspbilly
RaspbillyRaspbilly
Raspbilly
 
Shimane2008
Shimane2008Shimane2008
Shimane2008
 
Ruby on Rails 入門
Ruby on Rails 入門Ruby on Rails 入門
Ruby on Rails 入門
 
image_upload Plugin 2007/12/7
image_upload Plugin 2007/12/7image_upload Plugin 2007/12/7
image_upload Plugin 2007/12/7
 
Ruby on Rails ステップアップ講座 - 大場寧子
Ruby on Rails ステップアップ講座 - 大場寧子Ruby on Rails ステップアップ講座 - 大場寧子
Ruby on Rails ステップアップ講座 - 大場寧子
 
Ruby on Rails 中級者を目指して - 大場寧子
Ruby on Rails 中級者を目指して - 大場寧子Ruby on Rails 中級者を目指して - 大場寧子
Ruby on Rails 中級者を目指して - 大場寧子
 
Bookscope 2007 09 07
Bookscope 2007 09 07Bookscope 2007 09 07
Bookscope 2007 09 07
 

Pragmatic Patterns of Ruby on Rails - Ruby Kaigi2009