ï»??xml version="1.0" encoding="utf-8" standalone="yes"?> 现æ¥è¯´Rails里é¢å¦‚ä½•åŠ è²configçš„å§ã€?/p>
在java里é¢config¾l对是一个resourceæ–‡äšgåQŒç„¶åŽé€šè¿‡è¯Õd–é…ç½®çš„å·¥å…·åŠ å…¥è¿›æ¥ï¼Œåœ¨åˆ†æžå¤„ç†ã€?/p>
在ROR里é¢å®Œå…¨ä¸æ˜¯˜q™ä¹ˆå›žäº‹ã€?/p>
1.首先大家è¦äº†è§£çš„æ˜¯ï¼Œåœ¨æˆ‘们å¯åŠ?ruby script/server 的时候,railsåšäº†ä¸€¾pÕdˆ—的处ç†ï¼Œæœ€åŽä»–执行äº?font face="Arial">environment.rb ˜q™é‡Œçš„config其实是Initializer内部的一个å˜é‡ï¼ŒæŽŒæŽ§å…¨å±€çš„é…¾|®ä¿¡æ¯ï¼Œæˆ‘们å¯ä»¥ä½¿ç”¨˜q™ä¸ªconfigæ¥é…¾|®æˆ‘们想è¦çš„ã€?span>Rails::Initializer.runçš„æºç 是˜q™æ ·çš„,yieldå†ä¸€‹Æ¡æ˜¾½CÞZº†ä»–çš„å¨åŠ›åQŒè®©æˆ‘们在酾|®æ–‡ä»¶ä¸å¾—以é…ç½®config。然åŽå®žä¾‹åŒ–了一个initializer 之åŽåQŒæŠŠconfigä½œäØ“å‚æ•°ä¼ 入了ã€?/span> 我们接ç€å¾€ä¸‹èµ°åQŒå¯ä»¥çœ‹åˆ°initializer åšäº†ä¸€¾pÕdˆ—çš„åˆå§‹åŒ–工作åQŒåŒ…括load_path的设定,路由的åˆå§‹åŒ–åQŒå’Œactiverecordçš„åˆå§‹åŒ–。我们关心的˜q˜æ˜¯é…置如何起作用,那么æ¥çœ‹çœ?font face="Arial">environments目录下é¢çš„é…¾|®æ–‡ä»¶æ˜¯å¦‚何导入的å§ã€?/font>
IO.read(configuration.environment_path) åQŒï¼Œ˜q™é‡Œž®×ƒ¸ä½¿ç”¨ä»€ä¹ˆå›žè°ƒä¸å›žè°ƒäº†ï¼Œè€Œæ˜¯òq²è„†IO拿出æ¥eval一把,˜q™é‡Œä¹Ÿæ˜¯åƒäº†ä¸€æƒŠï¼Œ˜q™æ ·ä¹Ÿå¯ä»¥å‘€~~~~~~~ç„¶åŽåQŒæˆ‘们å¯ä»¥çœ‹çœ‹ï¼Œä»–处ç†å¸¸é‡çš„æ–ÒŽ³•åQŒæŠŠè‡ªå·±é…置文äšgä¸çš„帔R‡å…¨éƒ¨æ”‘Ö…¥Object里é¢åQŒè“v到全局帔R‡çš„目的ã€?/span>
最¾lçš„˜q˜æ˜¯initialize_framework_settingsåQŒä‹É用了有一个ruby的技巧ã€?/font>
configuration.frameworks里é¢å˜æ”¾çš„æ˜¯rails个个¾l„äšgçš„åå—,比方说active_recordä¹‹ç±»ã€‚ç„¶åŽæŠŠ˜q™ä¸ªåå—大写转æ¢åQŒç„¶åŽç”¨constantizeå–å¾—ActiveRecord˜q™ä¸ªModule(注æ„åQŒè¿™äº›ä¸œè¥‰Kƒ½åœ¨activesupport里é¢å‘¢ï¼Œactivesupport/lib/active_support/core_ext/string/inflections.rb )。然åŽç”¨const_getå–å¾—˜q™ä¸ªæ¨¡å—çš„Base¾c»ï¼Œä¹Ÿå°±æ˜¯ActiveRecord::Base˜q™ä¸ª¾cÖMº†åQˆä¸‹é¢éƒ½å«åšBase¾c»ï¼‰åQŒæ‰€æœ‰çš„Rails的组仉™ƒ½æ˜¯è¿™ä¸ªå‘½å规则改天我们自己想è¦åšä¸€ä¸ªRailsçš„ç»„ä»¶åŠ ˜q›æ¥åQŒä¹Ÿå¯ä»¥˜q™æ ·åQˆä½†æ˜¯è¦½E微修改一个æºç )ã€?/p>
ç„¶åŽåQŒæˆ‘们å§config里é¢çš„内容给Base¾c…R€‚configuration.send(framework)是调用一个组件å¿U°çš„æ–ÒŽ³•åQŒæ¯”方说active_recordåQŒå°±æ˜¯åŽ»çš„config里é¢çš„active_record属性(˜q™æ˜¯æœ€åŸºæœ¬çš„)åQŒé€šè¿‡åŽé¢çš„do我们å¯ä»¥çœ‹åˆ°config˜q”回的是一个hashåQŒç„¶åŽæŠŠhash䏿¯ä¸€ä¸ªkeyä½œäØ“å˜é‡åQŒvalueä¸ÞZ¼ å…¥å€û|¼Œä¼ å…¥Base¾c…R€‚。。这里大家应该没什么问题了åQŒçœ‹çœ‹æˆ‘们的configæ–‡äšg是怎么写的å§ã€?/p>
哦,看ç€å¾ˆæ™•å§ï¼Œconfigž®±æ˜¯æˆ‘们的酾|®å¯¹è±¡ï¼ŒæŒ‰ç…§æˆ‘们上é¢çš„说法,config.action_view之类frameworkçš„å˜é‡åº”该是一个hashæ‰å¯¹å‘€åQŒå¦‚果是hashçš„è¯åQŒä¸åº”该用这æ ïLš„æ–¹å¼ä¼ å…¥åQŒå¯èƒ½ä¼šç”?config.action_view = {:debug_rjs => true}æ¥ä¼ å…¥ã€?/p>
OK.我们æ¥çœ‹˜q™ä¸ªå˜é‡åˆ°åº•æ˜¯ä»€ä¹ˆæ ·çš„hashã€?/p>
在åˆå§‹åŒ–˜q™äº›å˜é‡çš„æ—¶å€™ï¼ŒRails¾l™ä»–赋å€égØ“OrderedOptions.new。这个特ŒDŠçš„¾cÕdž‹å¯èƒ½ž®±æ˜¯å…³é”®ã€?/span> 看到其ä¸çš„玄妙了么,method_missing~~~åQï¼ å¦‚æžœè°ƒç”¨ä¸€ä¸?*=的方æ³?åQŒå°±åƒå½“ç”¨ä¼ å…¥ä¸€ä¸ªHASHçš„å€û|¼Œkeyž®±æ˜¯æ–ÒŽ³•çš„åå—ã€?/p>
也就是:config.action_view.debug_rjs  = true 相当�span>config.action_view[:debug_rjs] = true
Rails::Initializer.run doÂ
|
config
|
   Â
 Â
#
 ˜q™é‡Œèƒ½æ’入我们自å·Þqš„é…置。   Â?/span>
 Â
#
 config. 之类   Â
end  Â
def
 self.run(commandÂ
=
 :process, configurationÂ
=
 Configuration.new)   Â
 Â
yield
 configurationÂ
if
 block_given?   Â
  initializerÂ
=
 new configuration   Â
  initializer.send(command)   Â
  initializer   Â
end  Â
def
 load_environment   Â
  silence_warnings do  Â
    configÂ
=
 configuration   Â
    constantsÂ
=
 self.
class
.constants   Â
    eval(IO.read(configuration.environment_path), binding)   Â
    (self.
class
.constantsÂ
-
 constants).each doÂ
|
const
|
   Â
      Object.const_set(const, self.
class
.const_get(const))Â Â Â Â
    end  Â
  end  Â
end  Â
def
 initialize_framework_settings   Â
  configuration.frameworks.each doÂ
|
framework
|
   Â
    base_classÂ
=
 framework.to_s.camelize.constantize.const_get(
"
Base
"
)Â Â Â Â
  Â
    configuration.send(framework).each doÂ
|
setting, value
|
   Â
      base_class.send(
"
#{setting}=
"
, value)   Â
    end  Â
  end  Â
end  Â
#
 Settings specified here will take precedence over those in config/environment.rb   Â
  Â
#
 In the development environment your application's code is reloaded on   Â
#
 every request.  This slows down response time but is perfect for development   Â
#
 since you don't have to restart the webserver when you make code changes.   Â
config.cache_classesÂ
=
 false  Â
  Â
#
 Log error messages when you accidentally call methods on nil.   Â
config.whiny_nilsÂ
=
 true  Â
  Â
#
 Enable the breakpoint server that script/breakpointer connects to   Â
config.breakpoint_serverÂ
=
 true  Â
  Â
#
 Show full error reports and disable caching   Â
config.action_controller.consider_all_requests_localÂ
=
 true  Â
config.action_controller.perform_caching            Â
=
 false  Â
config.action_view.cache_template_extensions        Â
=
 false  Â
config.action_view.debug_rjs                        Â
=
 true  Â
  Â
#
 Don't care if the mailer can't send   Â
config.action_mailer.raise_delivery_errorsÂ
=
 false  Â
def
 initialize   Â
 Â
.   Â
 Â
.   Â
 Â
for
 frameworkÂ
in
 default_frameworks   Â
    self.send(
"
#{framework}=
"
, OrderedOptions.new)   Â
  end  Â
end  Â
class
 OrderedOptionsÂ
<
 OrderedHashÂ
#
:nodoc:Â Â Â Â
 Â
def
 []
=
(key, value)   Â
    super(key.to_sym, value)   Â
  end  Â
     Â
 Â
def
 [](key)   Â
    super(key.to_sym)   Â
  end  Â
  Â
 Â
def
 method_missing(name,Â
*
args)Â Â Â Â
   Â
if
 name.to_sÂ
=~
Â
/
(.
*
)
=
$
/
   Â
      self[$
1
.to_sym]Â
=
 args.first   Â
   Â
else
  Â
      self[name]   Â
    end  Â
  end  Â
end  Â
OK åQŒå¤§ä½“上æè¿°äº†ä¸€ä¸‹ï¼Œå¯ä»¥çœ‹åˆ°½Ž€å•的一个Railsåˆå§‹åŒ–å·²¾lç»™æˆ‘ä»¬å±•ç¤ºäº†å‡ ä¹Žå…¨éƒ¨rubyçš„é“丽之处,˜q™èƒ½è¯´æ˜ŽåQŒè¿™ä¸ªäº®ç‚¹è‚¯å®šæ˜¯è´¯ç©¿rails的基本,在以åŽçš„æ·±å…¥ç ”ç©¶ä¸æˆ‘们就能看åˆîCº†ã€?/span>