﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-差沙的密码 -- SSHWSFC's code-随笔分类-ROR</title><link>http://www.blogjava.net/sshwsfc/category/17421.html</link><description>1=1</description><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 10:38:59 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 10:38:59 GMT</pubDate><ttl>60</ttl><item><title>说说Rails吧，config的幕后工作</title><link>http://www.blogjava.net/sshwsfc/archive/2006/11/21/82487.html</link><dc:creator>差沙</dc:creator><author>差沙</author><pubDate>Tue, 21 Nov 2006 04:10:00 GMT</pubDate><guid>http://www.blogjava.net/sshwsfc/archive/2006/11/21/82487.html</guid><wfw:comment>http://www.blogjava.net/sshwsfc/comments/82487.html</wfw:comment><comments>http://www.blogjava.net/sshwsfc/archive/2006/11/21/82487.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sshwsfc/comments/commentRss/82487.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sshwsfc/services/trackbacks/82487.html</trackback:ping><description><![CDATA[
		<p>说ruby是怪异的语法有点不妥当，动态语言里面不乏这样的语法出现。但是看了一些源码后发现，使用ruby的用法真的各有不同，就像大家以前说的，ruby每个人写出来的可能都不同。</p>
		<p>现来说Rails里面如何加载config的吧。</p>
		<p>在java里面config绝对是一个resource文件，然后通过读取配置的工具加入进来，在分析处理。</p>
		<p>在ROR里面完全不是这么回事。</p>
		<p>1.首先大家要了解的是，在我们启动 ruby script/server 的时候，rails做了一系列的处理，最后他执行了<font face="Arial">environment.rb</font></p>
		<div class="code_title">
				<em>
						<font color="#990033">ruby 代码</font>
				</em>
				<br />
		</div>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">Rails::Initializer.run do </span>
				<span style="COLOR: #000000">|</span>
				<span style="COLOR: #000000">config</span>
				<span style="COLOR: #000000">|</span>
				<span style="COLOR: #000000">    <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  </span>
				<span style="COLOR: #008000">#</span>
				<span style="COLOR: #008000"> 这里能插入我们自己的配置。    </span>
				<span style="COLOR: #008000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000">  </span>
				<span style="COLOR: #008000">#</span>
				<span style="COLOR: #008000"> config. 之类    </span>
				<span style="COLOR: #008000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000">end   </span>
		</div>
		<p class="alt">这里的config其实是Initializer内部的一个变量，掌控全局的配置信息，我们可以使用这个config来配置我们想要的。<span><span>Rails::Initializer.run的源码是这样的，yield再一次显示了他的威力，让我们在配置文件中得以配置config。然后实例化了一个initializer 之后，把config作为参数传入了。</span></span></p>
		<div class="code_title">
				<em>
						<font color="#990033">ruby 代码</font>
				</em>
				<br />
		</div>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #0000ff">def</span>
				<span style="COLOR: #000000"> self.run(command </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> :process, configuration </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> Configuration.new)    <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  </span>
				<span style="COLOR: #0000ff">yield</span>
				<span style="COLOR: #000000"> configuration </span>
				<span style="COLOR: #0000ff">if</span>
				<span style="COLOR: #000000"> block_given?    <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  initializer </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> new configuration    <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  initializer.send(command)    <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  initializer    <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />end   </span>
		</div>
		<p class="alt">我们接着往下走，可以看到initializer 做了一系列的初始化工作，包括load_path的设定，路由的初始化，和activerecord的初始化。我们关心的还是配置如何起作用，那么来看看<font face="Arial">environments目录下面的配置文件是如何导入的吧。</font></p>
		<div class="code_title">
				<em>
						<font color="#990033">ruby 代码</font>
				</em>
		</div>
		<div class="dp-highlighter">
				<div class="bar">
				</div>
		</div>
		<p>
				<span class="builtin">
				</span>
		</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #0000ff">def</span>
				<span style="COLOR: #000000"> load_environment    <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  silence_warnings do   <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    config </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> configuration    <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    constants </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> self.</span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000">.constants    <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    eval(IO.read(configuration.environment_path), binding)    <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    (self.</span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000">.constants </span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #000000"> constants).each do </span>
				<span style="COLOR: #000000">|</span>
				<span style="COLOR: #000000">const</span>
				<span style="COLOR: #000000">|</span>
				<span style="COLOR: #000000">    <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />      Object.const_set(const, self.</span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000">.const_get(const))    <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    end   <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  end   <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />end   <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
		</div>
		<p>IO<span>.read(configuration.environment_path) ，，这里就不使用什么回调不回调了，而是干脆IO拿出来eval一把，这里也是吃了一惊，这样也可以呀~~~~~~~然后，我们可以看看，他处理常量的方法，把自己配置文件中的常量全部放入Object里面，起到全局常量的目的。</span></p>
		<p>
				<span>最绝的还是<font face="Arial">initialize_framework_settings，使用了有一个ruby的技巧。</font></span>
		</p>
		<span>
				<div class="code_title">
						<em>
								<font color="#990033">ruby 代码</font>
						</em>
				</div>
				<div class="bar">
				</div>
				<p class="alt">
				</p>
				<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						<span style="COLOR: #0000ff">def</span>
						<span style="COLOR: #000000"> initialize_framework_settings    <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  configuration.frameworks.each do </span>
						<span style="COLOR: #000000">|</span>
						<span style="COLOR: #000000">framework</span>
						<span style="COLOR: #000000">|</span>
						<span style="COLOR: #000000">    <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    base_class </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> framework.to_s.camelize.constantize.const_get(</span>
						<span style="COLOR: #800000">"</span>
						<span style="COLOR: #800000">Base</span>
						<span style="COLOR: #800000">"</span>
						<span style="COLOR: #000000">)    <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />   <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    configuration.send(framework).each do </span>
						<span style="COLOR: #000000">|</span>
						<span style="COLOR: #000000">setting, value</span>
						<span style="COLOR: #000000">|</span>
						<span style="COLOR: #000000">    <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />      base_class.send(</span>
						<span style="COLOR: #800000">"</span>
						<span style="COLOR: #800000">#{setting}=</span>
						<span style="COLOR: #800000">"</span>
						<span style="COLOR: #000000">, value)    <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    end   <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  end   <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />end   </span>
				</div>
				<p>configuration.frameworks里面存放的是rails个个组件的名字，比方说active_record之类。然后把这个名字大写转换，然后用constantize取得ActiveRecord这个Module(注意，这些东西都在activesupport里面呢，activesupport/lib/active_support/core_ext/string/inflections.rb )。然后用const_get取得这个模块的Base类，也就是ActiveRecord::Base这个类了（下面都叫做Base类），所有的Rails的组件都是这个命名规则改天我们自己想要做一个Rails的组件加进来，也可以这样（但是要稍微修改一个源码）。</p>
				<p>然后，我们吧config里面的内容给Base类。configuration.send(framework)是调用一个组件名称的方法，比方说active_record，就是去的config里面的active_record属性（这是最基本的），通过后面的do我们可以看到config返回的是一个hash，然后把hash中每一个key作为变量，value为传入值，传入Base类。。。这里大家应该没什么问题了，看看我们的config文件是怎么写的吧。</p>
				<div class="code_title">
						<em>
								<font color="#990033">ruby 代码</font>
						</em>
						<br />
				</div>
				<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						<span style="COLOR: #008000">#</span>
						<span style="COLOR: #008000"> Settings specified here will take precedence over those in config/environment.rb    </span>
						<span style="COLOR: #008000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						</span>
						<span style="COLOR: #000000">   <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
						<span style="COLOR: #008000">#</span>
						<span style="COLOR: #008000"> In the development environment your application's code is reloaded on    </span>
						<span style="COLOR: #008000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#</span>
						<span style="COLOR: #008000"> every request.  This slows down response time but is perfect for development    </span>
						<span style="COLOR: #008000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#</span>
						<span style="COLOR: #008000"> since you don't have to restart the webserver when you make code changes.    </span>
						<span style="COLOR: #008000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						</span>
						<span style="COLOR: #000000">config.cache_classes </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> false   <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />   <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
						<span style="COLOR: #008000">#</span>
						<span style="COLOR: #008000"> Log error messages when you accidentally call methods on nil.    </span>
						<span style="COLOR: #008000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						</span>
						<span style="COLOR: #000000">config.whiny_nils </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> true   <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />   <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
						<span style="COLOR: #008000">#</span>
						<span style="COLOR: #008000"> Enable the breakpoint server that script/breakpointer connects to    </span>
						<span style="COLOR: #008000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						</span>
						<span style="COLOR: #000000">config.breakpoint_server </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> true   <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />   <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
						<span style="COLOR: #008000">#</span>
						<span style="COLOR: #008000"> Show full error reports and disable caching    </span>
						<span style="COLOR: #008000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						</span>
						<span style="COLOR: #000000">config.action_controller.consider_all_requests_local </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> true   <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />config.action_controller.perform_caching             </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> false   <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />config.action_view.cache_template_extensions         </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> false   <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />config.action_view.debug_rjs                         </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> true   <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />   <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
						<span style="COLOR: #008000">#</span>
						<span style="COLOR: #008000"> Don't care if the mailer can't send    </span>
						<span style="COLOR: #008000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						</span>
						<span style="COLOR: #000000">config.action_mailer.raise_delivery_errors </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> false   </span>
				</div>
				<p class="alt">哦，看着很晕吧，config就是我们的配置对象，按照我们上面的说法，config.action_view之类framework的变量应该是一个hash才对呀，如果是hash的话，不应该用这样的方式传入，可能会用 config.action_view = {:debug_rjs =&gt; true}来传入。</p>
				<p>OK.我们来看这个变量到底是什么样的hash。</p>
				<div class="code_title">
						<em>
								<font color="#990033">ruby 代码</font>
						</em>
				</div>
				<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						<span style="COLOR: #0000ff">def</span>
						<span style="COLOR: #000000"> initialize    <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  <img src="http://www.blogjava.net/images/dot.gif" />.    <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  <img src="http://www.blogjava.net/images/dot.gif" />.    <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  </span>
						<span style="COLOR: #0000ff">for</span>
						<span style="COLOR: #000000"> framework </span>
						<span style="COLOR: #0000ff">in</span>
						<span style="COLOR: #000000"> default_frameworks    <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    self.send(</span>
						<span style="COLOR: #800000">"</span>
						<span style="COLOR: #800000">#{framework}=</span>
						<span style="COLOR: #800000">"</span>
						<span style="COLOR: #000000">, OrderedOptions.new)    <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  end   <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />end   </span>
				</div>
				<p class="alt">在初始化这些变量的时候，Rails给他赋值为OrderedOptions.<span class="keyword">new。这个特殊的类型可能就是关键。</span></p>
				<span class="keyword">
						<div class="code_title">
								<em>
										<font color="#990033">ruby 代码</font>
								</em>
								<br />
						</div>
						<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
								<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
								<span style="COLOR: #0000ff">class</span>
								<span style="COLOR: #000000"> OrderedOptions </span>
								<span style="COLOR: #000000">&lt;</span>
								<span style="COLOR: #000000"> OrderedHash </span>
								<span style="COLOR: #008000">#</span>
								<span style="COLOR: #008000">:nodoc:    </span>
								<span style="COLOR: #008000">
										<br />
										<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
								</span>
								<span style="COLOR: #000000">  </span>
								<span style="COLOR: #0000ff">def</span>
								<span style="COLOR: #000000"> []</span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000">(key, value)    <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    super(key.to_sym, value)    <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  end   <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />      <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  </span>
								<span style="COLOR: #0000ff">def</span>
								<span style="COLOR: #000000"> [](key)    <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    super(key.to_sym)    <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  end   <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />   <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  </span>
								<span style="COLOR: #0000ff">def</span>
								<span style="COLOR: #000000"> method_missing(name, </span>
								<span style="COLOR: #000000">*</span>
								<span style="COLOR: #000000">args)    <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
								<span style="COLOR: #0000ff">if</span>
								<span style="COLOR: #000000"> name.to_s </span>
								<span style="COLOR: #000000">=~</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #000000">/</span>
								<span style="COLOR: #000000">(.</span>
								<span style="COLOR: #000000">*</span>
								<span style="COLOR: #000000">)</span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000">$</span>
								<span style="COLOR: #000000">/</span>
								<span style="COLOR: #000000">    <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />      self[$</span>
								<span style="COLOR: #000000">1</span>
								<span style="COLOR: #000000">.to_sym] </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> args.first    <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
								<span style="COLOR: #0000ff">else</span>
								<span style="COLOR: #000000">   <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />      self[name]    <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    end   <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  end   <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />end   </span>
						</div>
						<p class="alt">看到其中的玄妙了么，method_missing~~~！！ 如果调用一个**=的方法 ，就像当用传入一个HASH的值，key就是方法的名字。</p>
						<p>也就是：<span>config.action_view.debug_rjs  = </span><span class="keyword">true</span><span> 相当于<span>config.action_view[:debug_rjs] = true</span></span></p>
						<p>
								<span>
										<span>OK ，大体上描述了一下，可以看到简单的一个Rails初始化已经给我们展示了几乎全部ruby的靓丽之处，这能说明，这个亮点肯定是贯穿rails的基本，在以后的深入研究中我们就能看到了。</span>
								</span>
						</p>
				</span>
		</span>
<img src ="http://www.blogjava.net/sshwsfc/aggbug/82487.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sshwsfc/" target="_blank">差沙</a> 2006-11-21 12:10 <a href="http://www.blogjava.net/sshwsfc/archive/2006/11/21/82487.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>说说Rails吧，启动开始。</title><link>http://www.blogjava.net/sshwsfc/archive/2006/11/20/82401.html</link><dc:creator>差沙</dc:creator><author>差沙</author><pubDate>Mon, 20 Nov 2006 15:43:00 GMT</pubDate><guid>http://www.blogjava.net/sshwsfc/archive/2006/11/20/82401.html</guid><wfw:comment>http://www.blogjava.net/sshwsfc/comments/82401.html</wfw:comment><comments>http://www.blogjava.net/sshwsfc/archive/2006/11/20/82401.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sshwsfc/comments/commentRss/82401.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sshwsfc/services/trackbacks/82401.html</trackback:ping><description><![CDATA[
		<p>为了记录自己看Rails源码的过程，全程记录无废话。<br /><br />我们看看script/server都干了什么</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">require File.dirname(__FILE__) </span>
				<span style="COLOR: #000000">+</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #000000">'</span>
				<span style="COLOR: #000000">/../config/boot</span>
				<span style="COLOR: #000000">'</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />require </span>
				<span style="COLOR: #000000">'</span>
				<span style="COLOR: #000000">commands/server</span>
				<span style="COLOR: #000000">'</span>
		</div>
		<br />引用了boot.rb这个文件。看来这个文件是rails启动的入口，来看看怎么回事吧。<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">unless defined?(RAILS_ROOT)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  root_path </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> File.join(File.dirname(</span><span style="COLOR: #800080">__FILE__</span><span style="COLOR: #000000">), </span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">..</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  unless RUBY_PLATFORM </span><span style="COLOR: #000000">=~</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">mswin32</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    require </span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">pathname</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    root_path </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> Pathname.new(root_path).cleanpath(true).to_s<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  end<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  RAILS_ROOT </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> root_path<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />end</span></div>这一部分定义了RAILS_ROOT这个系统的全局变量，指定了项目的根目录，大家可以在以后华丽的使用了。<br /><br />下一部分是找到rails，粗略看一下。<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">  </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> File.directory?(</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">#{RAILS_ROOT}/vendor/rails</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    require </span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">#{RAILS_ROOT}/vendor/rails/railties/lib/initializer</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  </span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    require </span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">rubygems</span><span style="COLOR: #800000">'</span></div>这里能看到，他先跑到<font color="#800000">vendor/rails<font color="#000000">去找rails了，这就是我们为什么能在插件里用rails是原因。如果没有那么gems的干活。<br />接下来是初始化一下load_path，没什么看的了。boot.rb就这样的吧。<br /><br />回到script/server的第二行，包含了<span style="COLOR: #000000">'</span><span style="COLOR: #000000">commands/server</span><span style="COLOR: #000000">'这个文件，这个文件是什么？Rails的源码里面找吧。我们在Rails的源码里面找到这个文件。<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">require </span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">active_support</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />require </span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">fileutils</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />begin<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  require_library_or_gem </span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">fcgi</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />rescue Exception<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  </span><span style="COLOR: #008000">#</span><span style="COLOR: #008000"> FCGI not available</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">end<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />server </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> case ARGV.first<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  when </span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">lighttpd</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    ARGV.shift<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  when </span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">webrick</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    ARGV.shift<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  </span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> RUBY_PLATFORM !</span><span style="COLOR: #000000">~</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">mswin</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000"> !silence_stderr { `lighttpd </span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">version` }.blank? </span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000"> defined?(FCGI)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />      </span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">lighttpd</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />      </span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">webrick</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    end<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />end<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> server </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> </span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">webrick</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  puts </span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">=&gt; Booting WEBrick<img src="http://www.blogjava.net/images/dot.gif" /></span><span style="COLOR: #800000">"</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  puts </span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">=&gt; Booting lighttpd (use 'script/server webrick' to force WEBrick)</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />end<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />FileUtils.mkdir_p(</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">w( tmp</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">sessions tmp</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">cache tmp</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">sockets ))<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />require </span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">commands/servers/#{server}</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div></span></font></font>没想到ActiveRecord居然是在这里引用的，这个ActiveRecord里面扩展了很对Ruby的既有类型，所以我们看源码的时候如果发现有不熟悉的方法，就来这里找找，当然，看Rails的API是最好的选择。<br /><br />从参数一目了然，我们可以传入server的名字，<span style="COLOR: #800000">lighttpd和<span style="COLOR: #800000">webrick<font color="#000000">，根据不同的server选择不同的server文件来读取。我们还是看看<span style="COLOR: #800000">webrick<font color="#000000">的吧。<br /><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">require </span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">webrick</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />require </span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">optparse</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />OPTIONS </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> {<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  :port            </span><span style="COLOR: #000000">=&gt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">3000</span><span style="COLOR: #000000">,<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  :ip              </span><span style="COLOR: #000000">=&gt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">0.0.0.0</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">,<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  :environment     </span><span style="COLOR: #000000">=&gt;</span><span style="COLOR: #000000"> (ENV[</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">RAILS_ENV</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">] </span><span style="COLOR: #000000">||</span><span style="COLOR: #000000"> </span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">development</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">).dup,<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  :server_root     </span><span style="COLOR: #000000">=&gt;</span><span style="COLOR: #000000"> File.expand_path(RAILS_ROOT </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> </span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">/public/</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">),<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  :server_type     </span><span style="COLOR: #000000">=&gt;</span><span style="COLOR: #000000"> WEBrick::SimpleServer,<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  :charset         </span><span style="COLOR: #000000">=&gt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">UTF-8</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">,<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  :mime_types      </span><span style="COLOR: #000000">=&gt;</span><span style="COLOR: #000000"> WEBrick::HTTPUtils::DefaultMimeTypes<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />}<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />ARGV.options do </span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">opts</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  script_name </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> File.basename($0)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  opts.banner </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">Usage: ruby #{script_name} [options]</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  opts.separator </span><span style="COLOR: #800000">""</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  opts.on(</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">-p</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">, </span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">--port=port</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">, Integer,<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />          </span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">Runs Rails on the specified port.</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">,<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />          </span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">Default: 3000</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">) { </span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">v</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000"> OPTIONS[:port] </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> v }<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  opts.on(</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">-b</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">, </span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">--binding=ip</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">, String,<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />          </span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">Binds Rails to the specified ip.</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">,<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />          </span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">Default: 0.0.0.0</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">) { </span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">v</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000"> OPTIONS[:ip] </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> v }<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  opts.on(</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">-e</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">, </span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">--environment=name</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">, String,<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />          </span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">Specifies the environment to run this server under (test/development/production).</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">,<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />          </span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">Default: development</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">) { </span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">v</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000"> OPTIONS[:environment] </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> v }<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  opts.on(</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">-m</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">, </span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">--mime-types=filename</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">, String,<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />                  </span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">Specifies an Apache style mime.types configuration file to be used for mime types</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">,<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />                  </span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">Default: none</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">) { </span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">mime_types_file</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000"> OPTIONS[:mime_types] </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> WEBrick::HTTPUtils::load_mime_types(mime_types_file) }<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  opts.on(</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">-d</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">, </span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">--daemon</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">,<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />          </span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">Make Rails run as a Daemon (only works if fork is available -- meaning on *nix).</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />          ) { OPTIONS[:server_type] </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> WEBrick::Daemon }<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  opts.on(</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">-c</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">, </span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">--charset=charset</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">, String,<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />          </span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">Set default charset for output.</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">,<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />          </span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">Default: UTF-8</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">) { </span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">v</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000"> OPTIONS[:charset] </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> v }<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  opts.separator </span><span style="COLOR: #800000">""</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  opts.on(</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">-h</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">, </span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">--help</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">,<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />          </span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">Show this help message.</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">) { puts opts; exit }<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  opts.parse!<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />end<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />ENV[</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">RAILS_ENV</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">] </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> OPTIONS[:environment]<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />RAILS_ENV.replace(OPTIONS[:environment]) </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> defined?(RAILS_ENV)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />require RAILS_ROOT </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> </span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">/config/environment</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />require </span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">webrick_server</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />OPTIONS[</span><span style="COLOR: #800000">'</span><span style="COLOR: #800000">working_directory</span><span style="COLOR: #800000">'</span><span style="COLOR: #000000">] </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> File.expand_path(RAILS_ROOT)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />puts </span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">=&gt; Rails application started on http://#{OPTIONS[:ip]}:#{OPTIONS[:port]}</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />puts </span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">=&gt; Ctrl-C to shutdown server; call with --help for options</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> OPTIONS[:server_type] </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> WEBrick::SimpleServer<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />DispatchServlet.dispatch(OPTIONS)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div></font></span></font></span></span>本来不想把大段的代码贴上来，但是这里面的内容可能大家都比较关心，涉及到server的启动参数。<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  :port            <span style="COLOR: #000000">=&gt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">端口</span><span style="COLOR: #000000">,<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  :ip              </span><span style="COLOR: #000000">=&gt;</span><span style="COLOR: #000000"> server ip</span><span style="COLOR: #000000">,<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  :environment     </span><span style="COLOR: #000000">=&gt;</span><span style="COLOR: #000000">运行环境</span><span style="COLOR: #000000">,<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  :server_root     </span><span style="COLOR: #000000">=&gt;</span><span style="COLOR: #000000"> web访问的目录，（很多人问这个怎么改）</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  :server_type     </span><span style="COLOR: #000000">=&gt;</span><span style="COLOR: #000000"> WEBrick::SimpleServer,<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  :charset         </span><span style="COLOR: #000000">=&gt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">UTF-8</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">, 编码<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  :mime_types      </span><span style="COLOR: #000000">=&gt;</span><span style="COLOR: #000000"> WEBrick::HTTPUtils::DefaultMimeTypes<br /><br />后面的require 引入了两个文件，一个是<span style="COLOR: #800000">'</span><span style="COLOR: #800000">webrick_server</span><span style="COLOR: #800000">'<font color="#000000">，别看，就是他。另外一个是</font><font color="#800000">config/environment</font><font color="#000000">，这个文件是系统的全局配置文件，很重要，我们还是下次看看这个文件去吧。里面还真挺有意思。<br /><br />（不知道blogjava让不让写ROR的文章，看到有人写了所以放在首页了，如果不妥，我会尽快删除）</font></span></span><img src ="http://www.blogjava.net/sshwsfc/aggbug/82401.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sshwsfc/" target="_blank">差沙</a> 2006-11-20 23:43 <a href="http://www.blogjava.net/sshwsfc/archive/2006/11/20/82401.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>