2005-08-10 Í¥¤·¤¤Rails¤Î°é¤ÆÊý [ĹǯÆüµ­]

¡ü ½ø¾Ï

¤³¤ì¤Ï¡¢¤«¤Ä¤Æ Ruby ¤¬¤Þ¤À¿ÀÏäÀ¤Ã¤¿»þÂ塢ŷ»Èã¤Î´Ö¤Çή¹Ô¤Ã¤¿²Î(Å·¾å³¦¥ª¥ê¥³¥ó13°Ì)¤Ç¤¢¤ë¡£

¡Öautoload¡×¤È¸À¤¦¥³¥È¥Ð¤Ë¡¢¤Ê¤ó¤«¤¢¤³¤¬¤ì¤Æ¤¿¡¼¡£
¼ÂºÝ²¿¤ò¤¹¤ë¤Î¤«¡¢¤¤¤Þ¤À¤Ë¤ï¤«¤ó¤Ê¤¤¡¦¡¦¡¦(¥è¥í¥·¥¯)¡£
ưŪ¸Æ½Ð¤µ¤ì¤Æ¤¦¤ì¤·¤¯»×¤¤(¥è¥í¥·¥¯)¡£
module ÈóÂбþ¤ÇÎÞ¤¬½Ð¤¿¤ê¡£Ë»¤·¤¤¤Ê¡£

(Ê¡²»½ñ¡Ö21»þ¤Þ¤Ç¤Î¥·¥ó¥Ç¥ì¥é¡×¡¢2¾Ï¡¢AÀá¤è¤ê)

¡ü [rails] LoadingModule (active_support)

LoadingModule ¤ÏưŪ¤Ê¥¯¥é¥¹»²¾È¤òÄ󶡤¹¤ëµ¡Ç½¤Ç¤¹¡£Ä̾Rails ¤ò»È¤Ã¤Æ¤¤¤ë¤È°Õ¼±¤·¤Ê¤¤¤Þ¤Þ¤½¤Î²¸·Ã¤ò¼õ¤±¤Æ¤¤¤Þ¤¹¤¬¡¢¥â¥Ç¥ë¤ä¥Ó¥å¡¼¤Î¥¯¥é¥¹ÄêµÁ¥Õ¥¡¥¤¥ë¤Ê¤É¤¬²¿¤Î½àÈ÷¤â¤Ê¤·¤Ë¼«Æ°Åª¤Ë»²¾È¤µ¤ì¤ë¤Î¤Ï¤³¤Îµ¡Ç½¤Î¤ª±¢¤Ç¤¹¡£Æ±Íͤε¡Ç½¤Ç¤¢¤ë Ruby ÁȤ߹þ¤ß¤Î autoload ¤è¤ê¤â°Ê²¼¤ÎÅÀ¤ÇÍ¥¤ì¤Æ¤¤¤Þ¤¹¡£

  1. ¥Í¡¼¥à¥¹¥Ú¡¼¥¹¤ò¹Íθ¤·¤Æ¤¯¤ì¤ë (Ruby¥¹¥¿¥¤¥ë¤Ê¥â¥¸¥å¡¼¥ë¤Ë¤âÂбþ)
  2. ÄêµÁ¤¬ÉÔÍ× (¥á¥ó¥Æ¥Ê¥ó¥¹¥Õ¥ê¡¼¢ö)

¥¯¥é¥¹¤ò¼«ºî¤¹¤ë¾ì¹ç¡¢ÈÆÍÑÀ­¤ò°Õ¼±¤¹¤ë¤È¾¥â¥¸¥å¡¼¥ë¤È¤Î̾Á°¾×ÆÍ¤Î´í¸±À­¤«¤é¥Í¡¼¥à¥¹¥Ú¡¼¥¹Åª¤Ë¥â¥¸¥å¡¼¥ë¤òÄêµÁ¤¹¤ë¤³¤È¤Ë¤Ê¤ê¤Þ¤¹¤¬¡¢Å·»È¤Ê¤é¤º¤È¤â autoload ¤¬¥Í¡¼¥à¥¹¥Ú¡¼¥¹¤ËÂбþ¤·¤Æ¤¤¤Ê¤¯¤ÆÈᤷ¤¤ÁÛ¤¤¤ò¤·¤¿¿Í¤Ï¿¤¤¤Ç¤·¤ç¤¦¡£¤½¤³¤Ç¿Í´Öã¤Ï¹Í¤¨¤Þ¤·¤¿¡£¥â¥¸¥å¡¼¥ëÁ´ÂΤòÆÉ¤ß¹þ¤à¤¿¤á¤Î¥Õ¥¡¥¤¥ë¤òÍѰդ·¡¢¤½¤Î¥Í¡¼¥à¥¹¥Ú¡¼¥¹Åª¤Ê¥â¥¸¥å¡¼¥ë̾¤À¤±¤ò autoload ¤Î¥È¥ê¥¬¤ËÀßÄꤷ¤Æ¤½¤Î¥Õ¥¡¥¤¥ë¤ò»ØÄꤹ¤ë¤Î¤Ç¤¹¡£°ìÈÌŪ¤Ë¤Ï¡¢¤³¤¦¤¤¤¦¾ì¹ç

(¥â¥¸¥å¡¼¥ë̾).rb
(¥â¥¸¥å¡¼¥ë̾)/(¥¯¥é¥¹£±).rb   # (¥â¥¸¥å¡¼¥ë)::(¥¯¥é¥¹£±)¤òÄêµÁ¤·¤¿¥Õ¥¡¥¤¥ë
              /(¥¯¥é¥¹£²).rb
              /...

¤È¤¤¤¦¤è¤¦¤Ë¥Í¡¼¥à¥¹¥Ú¡¼¥¹¤È¥Ç¥£¥ì¥¯¥È¥ê³¬ÁؤòÂбþ¤µ¤»¤¿¹½Â¤¤ÇÇÛÃÖ¤·¤Þ¤¹¡£¤³¤Î·Á¼°¤ò¡ÖRuby¥¹¥¿¥¤¥ë¤Ê¥â¥¸¥å¡¼¥ë¡×¤È¸Æ¤Ó¤Þ¤¹¡£(¾¯¤Ê¤¯¤È¤â¤³¤³¤Ç¤Ï)¡£LoadingModule ¤Ï¤³¤¦¤¤¤Ã¤¿¥Í¡¼¥à¥¹¥Ú¡¼¥¹¤Þ¤ÇÂбþ¤·¤¿Æ°Åª¤Ê¸Æ¤Ó½Ð¤·¤ò¼Â¸½¤·¤Ä¤Ä¤â¡¢¤½¤ì¤é¤òÍøÍѤ¹¤ë¤¿¤á¤ÎÀë¸À¤âɬÍפʤ¤¡¢¤È¤¤¤¦ÂçÊÑÊØÍø¤Ê¤â¤Î¤Ç¤¹¡£¤½¤Î¥á¥«¥Ë¥º¥à¤òÃΤé¤Ê¤¯¤Æ¤â»È¤¨¤ë¤Î¤Ç¤¹¤¬¡¢¥â¥¸¥å¡¼¥ë̾¤Î¥Ð¥Ã¥Æ¥£¥ó¥°¤äưŪ»²¾È¤ËÌäÂ꤬ȯÀ¸¤¹¤ë¤È¸¶°øµæÌÀ¤Ë»×¤ï¤Ì»þ´Ö¤òÈñ¤ä¤¹¤³¤È¤¬¤¢¤ê¤Þ¤¹¤·¡¢²¿¤è¤ê Rails °Ê³°¤ÇÍøÍѤ¹¤ë¾ì¹ç¤Î¤¿¤á¤Ë¤â¡¢¤½¤Îµóư¤òÇİ®¤·¤Æ¤ª¤­¤Þ¤·¤ç¤¦¡£

¡ü ¥í¡¼¥É¥Ñ¥¹¤ÎÀßÄê

Ruby ¤Î¥í¡¼¥É¥Ñ¥¹($:)¤ËÆþ¤Ã¤Æ¤¤¤ë¤â¤Î¤Ï¼«Æ°Åª¤ËÆÉ¤ß½Ð¤·¤ÎÂоݤˤʤê¤Þ¤¹¤Î¤Ç¡¢active_support ¤ò require ¤¹¤ë¤À¤±¤ÇưŪ¸Æ¤Ó½Ð¤·¤Î²¸·Ã¤ò¼õ¤±¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤Þ¤¿¡¢Ruby¥¹¥¿¥¤¥ë¤Î¥â¥¸¥å¡¼¥ë¤òưŪ¤Ë¸Æ¤Ó½Ð¤¹¾ì¹ç¤Ï¡¢LoadingModule.root ¥á¥½¥Ã¥É¤Ç¤½¤Î¥Ñ¥¹¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£

Controlloers = LoadingModule.root(*load_paths)

°ú¿ô¤Ç¥Ñ¥¹(Ê£¿ô²Ä)¤òÅϤ·¤Æ¡¢Ìá¤êÃÍ(RootLoadingModule¤Î¥¤¥ó¥¹¥¿¥ó¥¹)¤ò Controllers ¤È¤¤¤¦Äê¿ô¤ËÆþ¤ì¤Þ¤¹¡£(Äê¿ô̾¤â¸ÇÄê¤Ê¤éÃæ¤Ç¾¡¼ê¤Ë¤ä¤Ã¤Æ¤¯¤ì¤ì¤Ð¤¤¤¤¤Î¤Ë)¡£¶ñÂÎŪ¤Ë¤Ï¡¢Rails ¤Ç¤Ï config/environment.rb ¤Ë°Ê²¼¤Î¤è¤¦¤Êµ­½Ò¤¬¤¢¤ê¤Þ¤¹¡£

Controllers = Dependencies::LoadingModule.root(
  File.join(RAILS_ROOT, 'app', 'controllers'),
  File.join(RAILS_ROOT, 'components')
)

¤³¤ì¤Ë¤è¤ê¡¢app/controllers/ ¤È components/ °Ê²¼¤Ë¤¢¤ë¥Õ¥¡¥¤¥ë¤Ï¡¢Ruby¥¹¥¿¥¤¥ë¤Ê¥â¥¸¥å¡¼¥ë¤È¤·¤Æ¤âưŪ¤Ë¸Æ¤Ó½Ð¤¹¤³¤È¤¬²Äǽ¤Ë¤Ê¤ê¤Þ¤¹¡£´ÉÍý¾å¡¢¥¯¥é¥¹Ì¾¤Î¥È¥Ã¥×¥ì¥Ù¥ë¤Ë Controllers ¤È¤¤¤¦¥Í¡¼¥à¥¹¥Ú¡¼¥¹¤¬¤Ä¤­¤Þ¤¹¤¬µ¤¤Ë¤·¤Ê¤¯¤ÆÂç¾æÉפǤ¹¡£¤³¤Î environment.rb ¤Î¥Ç¥Õ¥©¥ë¥È¥Õ¥¡¥¤¥ë¤«¤é¡¢lib ¤Ë¤ÏÄ̾ï¥â¥¸¥å¡¼¥ë(¥é¥¤¥Ö¥é¥ê)¡¢components ¤Ë¤Ï Ruby¥¹¥¿¥¤¥ë¤Ê¥â¥¸¥å¡¼¥ë¤òÃÖ¤¯¡¢¤È¤¤¤¦ÍøÍÑË¡¤¬ Rails ¤Ç´üÂÔ¤µ¤ì¤Æ¤¤¤ë¤³¤È¤¬ÆÉ¤ß¼è¤ì¤Þ¤¹¡£

¡ü ¥¯¥é¥¹»²¾È»þ¤Î¥á¥«¥Ë¥º¥à

Â绨ÇĤ˸À¤¦¤È¡¢°Ê²¼¤Îή¤ì¤ÇưŪ¤Ê¥¯¥é¥¹(Äê¿ô)¤¬¸Æ¤Ó½Ð¤µ¤ì¤Þ¤¹¡£

  1. const_missing ¤¬È¯À¸
  2. ¥¯¥é¥¹Ì¾¢ª¥Õ¥¡¥¤¥ë̾ÊÑ´¹ #Inflector.underscore(name)
  3. ¥í¡¼¥É¥Ñ¥¹¤«¤éÂоݥե¡¥¤¥ë¤ò¸¡º÷

¤Þ¤º¡¢const_missing ¤¬»²¾È¤Î¥È¥ê¥¬¤Ë¤Ê¤ê¤Þ¤¹¡£¼¡¤Ë Rails ¥æ¡¼¥¶¤Ë¤Ï¤ªÆëÀ÷¤ß¤Î¥Õ¥¡¥¤¥ë̾ÊÑ´¹¤¬Æþ¤ê¤Þ¤¹¡£¤³¤ì¤ÏÂç¶Ú¤Ç¥¯¥é¥¹Ì¾(Äê¿ô̾)¤ÎÀèÆ¬°Ê³°¤ÎÂçʸ»ú¤ÎÁ°¤Ë'_'¤òÄɲä·¤ÆÁ´Éô¾®Ê¸»ú¤Ë¤¹¤ëÊÑ´¹¤Ç¤¹¡£(Ϣ³¤¹¤ëÂçʸ»ú¤È¤«¤¬°ã¤¦¤±¤É¾Êά)¡£LoadingModule ¤¬ÍøÍѤµ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢¥Í¡¼¥à¥¹¥Ú¡¼¥¹¤Þ¤Ç¹Í褵¤ì¤Þ¤¹¡£

Inflector.underscore('AccessLog')
  => "access_log"
Inflector.underscore('HelloProject::Units::BerryzKobo')
  => "hello_project/units/berryz_kobo"

¡ü rails °Ê³°¤Ç¤ÎÍøÍÑÎã

Î㤨¤Ð¡¢lib/*.rb ¤Ë¥é¥¤¥Ö¥é¥ê¡¢modules/* ¤ËŬÅö¤Ê¥â¥¸¥å¡¼¥ë¤¬¤¢¤ë¾ì¹ç¡£

# lib/db_adapter.rb:
module DBAdapter
  def load

# modules/hello_project/units/berryz_kobo.rb:
module HelloProject
  module Units
    class BerryzKobo
      include HelloProject::DBAdapter
      # include DBAdapter ¤À¤È lib/db_adapter.rb ¤¬»²¾È¤µ¤ì¤Æ¤·¤Þ¤¦

# modules/hello_project/db_adapter.rb:
module HelloProject
  module DBAdapter
    def load

¼Â¹Ô¥Õ¥¡¥¤¥ë¤Ç¤¹¡£

# test.rb:
#!/usr/bin/ruby

require 'active_support'                                    # ưŪ¸Æ¤Ó½Ð¤·¤ÎÀßÄê
$: .unshift 'lib'                                           # lib/*.rb ¤ÏÄ̾ï¤ÎưŪ¸Æ¤Ó½Ð¤·
Controllers = Dependencies::LoadingModule.root('modules')   # modules/* ¤Ï¥Í¡¼¥à¥¹¥Ú¡¼¥¹ÉÕ¤­Æ°Åª¸Æ¤Ó½Ð¤·

berryz = HelloProject::Units::BerryzKobo.new
berryz.load
...

¡ü ¤ª¤Þ¤±

к ¡Çw¡Ç) ¡ãView ¤Ë¤Ï Helper ¤¬¤¢¤ë¤±¤É¡¢Controller ¤Ë¤Ï²¿¤Ç¤Ê¤¤¤ó¤À¤í¤¦¡©

ŽÙ üý-üýŽØ ¡ãLoadingModule ¤ò¥Þ¥¹¥¿¡¼¤·¤¿¤³¤Î²Ä°¦¤¤Åí»ÒÍͤˤ«¤«¤ì¤Ð´Êñ¤è¢ö

# config/environment.rb:
$: .unshift('app/presenters')

# app/presenters/berryz_presenter.rb
module BerryzPresenter
  def members
    Berryz.find_all
  end

# app/controllers/berryz_controller,rb
class BerryzController < ApplicationController
  include BerryzPresenter
end

ŽÉŽÉl¢ß_¢ß'ŽÙ ¡ã¤½¤â¤½¤â¡¢app/models ¤È¤«¤Ï¥é¥¤¥Ö¥é¥ê°·¤¤¤Ç¡¢app/controllers/ ¤¬¥â¥¸¥å¡¼¥ë°·¤¤(LoadingModule)¤Æ¤³¤È¤Ï¡¢¡¢¡¢

½£*¡Æ o¡Æ¥ê ¡ãapp/controllers/helpers/berryz.rb ¤ËÃÖ¤¤¤Æ¡¢include Helpers::Berryz ¤¬´üÂÔ¤µ¤ì¤Æ¤ë¤Î¤«¤·¤é¡©

¡Ê¡­(Ž´)¡®¡Ë޲ ¡ã¤Ç¤â¡¢Berryz¤¬¥â¥Ç¥ë¤È¾×ÆÍ¤·¤Æ¤ë¤«¤éÉݤ¤¥¯¥Þ¡¼¡£

Àî¡­¡¦_¡¦¡®Àî¡ãBerryzHelper ¤â View ¤Î¤È¤«¤Ö¤Ã¤Á¤ã¤¤¤Þ¤¹¤Í¡£

к¡­¢à¡®Ðº ¡ãBerryzControllerHelper ... ¤Ï¡¢Ä¹¤¤¤Ç¤¹¤·¡¼¡£

кoŽß¡¼Žßк ¡ã·ë¶É¡¢¤è¤¤Ì¾Á°¤¬¸«¤Ä¤«¤é¤Ê¤«¤Ã¤¿¤«¤é Controller ¤Ë¤Ï¥Ø¥ë¥Ñ¤¬¤Ê¤¤¡¢¤È¤æ¤¤¤¿¤¤¤Ç¤¹¡£

к ¡Çw¡Ç) ¡ã¤È¤ê¤¢¤¨¤º¡¢Åí¤Á¤ã¤ó¤Î¤¬¤¤¤¤¤«¤Ê¡©(presenter ¤«¤É¤¦¤«¤Ï¤ª¤¤¤È¤¤¤Æ)

ŽÉŽÉl¢ß_¢ß'ŽÙ ¡ã¤¢¤È¤Ï¡¢Controller ¤ò°µÇ÷¤¹¤ëÊ£»¨¤ÊSQL¤È¤«¤ò¥ê¥½¡¼¥¹¤ËÄɤ¤½Ð¤¹¤Î¤â³Ú¤·¤¤¤«¤â¤Í¢ö

# config/environment.rb:
  File.join(RAILS_ROOT, 'resources'),   # LoadingModule.root ¤ÎÃæ¤ËÄɲÃ

# resources/sql/berryz.rb
module Sql
  module Berryz
    SELECT_MEMBER  = <<EOF
      SELECT * FROM ...
    SELECT_CONCERT = ...

# app/controllers/berryz_controller,rb
class BerryzController < ApplicationController
  def information
    @members  = Berryz::find_by_sql(Sql::Berryz::SELECT_MEMBER)
    @concerts = Berryz::find_by_sql(Sql::Berryz::SELECT_CONCERT)
  end

½£*¡Æ o¡Æ¥ê ¡ã¤³¤¦¤·¤ÆÅ·»Èã¤ÏÈîÂç²½¤·¤¬¤Á¤Ê Controller ¤ò¥¹¥ê¥à¤Ë¤·¤¿¤Î¤Ç¤·¤¿¡£

к¡Çw¡Ç) ¡ã¥Ç¥ì¥Ç¥ì!!¥·¥ó¥Ç¥ìLOVE!!


¥µ¥¤¥ÈÆâ¸¡º÷ (by Google)

| JRuby | Rails | Berryz | ¡î-ute | ¥¨¥Ã¥° | jQuery |

²áµî

Á° 2005ǯ
8·î
¼¡
Æü ·î ²Ð ¿å ÌÚ ¶â ÅÚ
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31

̤Íè

¥³¥ó¥¿¥¯¥È