<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>Foreverman</title>
    <description></description>
    <link>http://sean.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>&quot;class instance variable&quot; 和 “class variable”的区别</title>
        <author>sean</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://sean.javaeye.com">sean</a>&nbsp;
          链接：<a href="http://sean.javaeye.com/blog/133827" style="color:red;">http://sean.javaeye.com/blog/133827</a>&nbsp;
          发表时间: 2007年10月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <ul>
    <li>class variables are available in class methods and instance methods, but class instance variable is only available in class methods:
    <div class="code_title">ruby 代码</div>
    <div class="dp-highlighter">
    <ol class="dp-rb" start="1">
        <li class="alt"><span><span class="keyword">class</span><span>&nbsp;Test&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li>
        <li class=""><span>&nbsp;&nbsp;@<span class="variable">@cla_var</span><span>&nbsp;=&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li>
        <li class="alt"><span>&nbsp;&nbsp;<span class="variable">@inst_var</span><span>&nbsp;=&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li>
        <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
        <li class="alt"><span>&nbsp;&nbsp;<span class="keyword">def</span><span>&nbsp;</span><span class="keyword">self</span><span>.cla_var&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li>
        <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;@<span class="variable">@cla_var</span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li>
        <li class="alt"><span>&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li>
        <li class=""><span>&nbsp;&nbsp;<span class="keyword">def</span><span>&nbsp;cla_var&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li>
        <li class="alt"><span>&nbsp;&nbsp;&nbsp;@<span class="variable">@cla_var</span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li>
        <li class=""><span>&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li>
        <li class="alt"><span>&nbsp;&nbsp;<span class="keyword">def</span><span>&nbsp;</span><span class="keyword">self</span><span>.inst_var&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li>
        <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="variable">@inst_var</span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li>
        <li class="alt"><span>&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li>
        <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
        <li class="alt"><span>&nbsp;&nbsp;<span class="keyword">def</span><span>&nbsp;inst_var&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li>
        <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">#here&nbsp;@inst_var&nbsp;is&nbsp;treated&nbsp;as&nbsp;the&nbsp;instance&nbsp;variable&nbsp;not&nbsp;class&nbsp;instance&nbsp;variable&nbsp;&nbsp;</span><span>&nbsp;&nbsp;</span></span></li>
        <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="variable">@inst_var</span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li>
        <li class=""><span>&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li>
        <li class="alt"><span>&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li>
    </ol>
    </div>
    </li>
    <li><span><span>Class variables are shared by children of the class in which they are first defined, but&nbsp; class instance variables not, every child has it's own copy of class instance variable(Rumor has it that ruby1.9 will change this).
    <div class="code_title">ruby 代码</div>
    <div class="dp-highlighter">
    <div class="bar">&nbsp;</div>
    <ol class="dp-rb" start="1">
        <li class="alt"><span><span class="keyword">class</span><span>&nbsp;Parent&nbsp;&nbsp;</span></span></li>
        <li class=""><span>&nbsp;&nbsp;&nbsp;@<span class="variable">@cla_var</span><span>&nbsp;=&nbsp;1&nbsp;&nbsp;</span></span></li>
        <li class="alt"><span>&nbsp;&nbsp;&nbsp;<span class="variable">@inst_var</span><span>&nbsp;=&nbsp;2&nbsp;&nbsp;</span></span></li>
        <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
        <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">def</span><span>&nbsp;</span><span class="keyword">self</span><span>.cla_var&nbsp;&nbsp;</span></span></li>
        <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@<span class="variable">@cla_var</span><span>&nbsp;&nbsp;</span></span></li>
        <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;</span></span></li>
        <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">def</span><span>&nbsp;</span><span class="keyword">self</span><span>.inst_var&nbsp;&nbsp;</span></span></li>
        <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="variable">@inst_var</span><span>&nbsp;&nbsp;</span></span></li>
        <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;</span></span></li>
        <li class="alt"><span>&nbsp;&nbsp;</span></li>
        <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">def</span><span>&nbsp;</span><span class="keyword">self</span><span>.cla_var=(cla_var)&nbsp;&nbsp;</span></span></li>
        <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@<span class="variable">@cla_var</span><span>&nbsp;=&nbsp;cla_var&nbsp;&nbsp;</span></span></li>
        <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;</span></span></li>
        <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">def</span><span>&nbsp;</span><span class="keyword">self</span><span>.inst_var=(inst_var)&nbsp;&nbsp;</span></span></li>
        <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="variable">@inst_var</span><span>&nbsp;=&nbsp;inst_var&nbsp;&nbsp;</span></span></li>
        <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;</span></span></li>
        <li class=""><span>&nbsp;&nbsp;</span></li>
        <li class="alt"><span><span class="keyword">end</span><span>&nbsp;&nbsp;</span></span></li>
        <li class=""><span><span class="keyword">class</span><span>&nbsp;Child1&nbsp;&lt;&nbsp;Parent&nbsp;&nbsp;</span></span></li>
        <li class="alt"><span><span class="keyword">end</span><span>&nbsp;&nbsp;</span></span></li>
        <li class=""><span><span class="keyword">class</span><span>&nbsp;Child2&nbsp;&lt;&nbsp;Parent&nbsp;&nbsp;</span></span></li>
        <li class="alt"><span><span class="keyword">end</span><span>&nbsp;&nbsp;</span></span></li>
        <li class=""><span>&nbsp;&nbsp;</span></li>
        <li class="alt"><span><span class="comment">#class&nbsp;variables&nbsp;are&nbsp;shared&nbsp;by&nbsp;parent&nbsp;and&nbsp;all&nbsp;the&nbsp;children</span><span>&nbsp;&nbsp;</span></span></li>
        <li class=""><span>&gt;&gt;&nbsp;Parent.cla_var&nbsp;&nbsp;</span></li>
        <li class="alt"><span>=&gt;&nbsp;1&nbsp;&nbsp;</span></li>
        <li class=""><span>&gt;&gt;&nbsp;Child1.cla_var&nbsp;&nbsp;</span></li>
        <li class="alt"><span>=&gt;&nbsp;1&nbsp;&nbsp;</span></li>
        <li class=""><span>&gt;&gt;&nbsp;Child2.cla_var&nbsp;&nbsp;</span></li>
        <li class="alt"><span>=&gt;&nbsp;1&nbsp;&nbsp;</span></li>
        <li class=""><span>&gt;&gt;&nbsp;Child1.cla_var&nbsp;=&nbsp;3&nbsp;&nbsp;</span></li>
        <li class="alt"><span>=&gt;&nbsp;3&nbsp;&nbsp;</span></li>
        <li class=""><span>&gt;&gt;&nbsp;Parent.cla_var&nbsp;&nbsp;</span></li>
        <li class="alt"><span>=&gt;&nbsp;3&nbsp;&nbsp;</span></li>
        <li class=""><span>&gt;&gt;&nbsp;Child2.cla_var&nbsp;&nbsp;&nbsp;</span></li>
        <li class="alt"><span>=&gt;&nbsp;3&nbsp;&nbsp;</span></li>
        <li class=""><span>&nbsp;&nbsp;</span></li>
        <li class="alt"><span><span class="comment">#every&nbsp;children&nbsp;has&nbsp;it's&nbsp;own&nbsp;copy&nbsp;of&nbsp;class&nbsp;instance&nbsp;variables</span><span>&nbsp;&nbsp;</span></span></li>
        <li class=""><span>&gt;&gt;&nbsp;Parent.inst_var&nbsp;&nbsp;</span></li>
        <li class="alt"><span>=&gt;&nbsp;2&nbsp;&nbsp;</span></li>
        <li class=""><span>&gt;&gt;&nbsp;Child1.inst_var&nbsp;&nbsp;</span></li>
        <li class="alt"><span>=&gt;&nbsp;<span class="keyword">nil</span><span>&nbsp;&nbsp;</span></span></li>
        <li class=""><span>&gt;&gt;&nbsp;Child2.inst_var&gt;&gt;&nbsp;Child1.inst_var&nbsp;=&nbsp;4&nbsp;&nbsp;</span></li>
        <li class="alt"><span>=&gt;&nbsp;4&nbsp;&nbsp;</span></li>
        <li class=""><span>&gt;&gt;&nbsp;Parent.inst_var&nbsp;&nbsp;</span></li>
        <li class="alt"><span>=&gt;&nbsp;2&nbsp;&nbsp;</span></li>
        <li class=""><span>&gt;&gt;&nbsp;Child2.inst_var&nbsp;&nbsp;</span></li>
        <li class="alt"><span>=&gt;&nbsp;<span class="keyword">nil</span><span>&nbsp;&nbsp;</span></span></li>
        <li class=""><span>&nbsp;&nbsp;</span></li>
        <li class="alt"><span>=&gt;&nbsp;<span class="keyword">nil</span><span>&nbsp;&nbsp;</span></span></li>
    </ol>
    </div>
    <br />
    </span></span></li>
</ul>
          <br/>
          <span style="color:red;">
            <a href="http://sean.javaeye.com/blog/133827#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 20 Oct 2007 17:18:49 +0800</pubDate>
        <link>http://sean.javaeye.com/blog/133827</link>
        <guid>http://sean.javaeye.com/blog/133827</guid>
      </item>
      <item>
        <title>Gotchas in rails validation</title>
        <author>sean</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://sean.javaeye.com">sean</a>&nbsp;
          链接：<a href="http://sean.javaeye.com/blog/131174" style="color:red;">http://sean.javaeye.com/blog/131174</a>&nbsp;
          发表时间: 2007年10月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          假设我为了让用户输入的数据长度不超过数据库定义的长度，定义了如下validation:
<div class="code_title">ruby 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-rb" start="1">
    <li class="alt"><span><span class="keyword">class</span><span>&nbsp;User&nbsp;&lt;&nbsp;ActiveRecord::Base&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;validates_length_of&nbsp;<span class="symbol">:name</span><span>,&nbsp;&nbsp;</span><span class="symbol">:maximum</span><span>&nbsp;=&gt;&nbsp;50&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="keyword">end</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
上面代码的行为有时却颇为怪异:
<div class="code_title">ruby 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-rb" start="1">
    <li class="alt"><span><span>ruby&nbsp;script/console&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&gt;&gt;&nbsp;u&nbsp;=&nbsp;User.<span class="keyword">new</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>=&gt;&nbsp;&nbsp;<span class="comment">#</span><span>&nbsp; <br />
    </span></span></li>
    <li class="alt"><span>&gt;&gt;&nbsp;u.valid?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class=""><span>=&gt;&nbsp;<span class="keyword">false</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&gt;&gt;&nbsp;u.errors.full_messages&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class=""><span>=&gt;[<span class="string">&quot;Name&nbsp;is&nbsp;too&nbsp;long&nbsp;(maximum&nbsp;is&nbsp;50&nbsp;characters)&quot;</span><span>]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<br />
<br />
注意当user对象的name为nil时，输出的错误却是[&quot;name is too long (maximum is 50 characters)&quot;]，驴唇不对马嘴！但事实确实如此，为什么？原因在于rails的所有validation方法都支持一个可选参数:allow_nil。allow_nil默认为false, 所以当user对象的name属性为nil时,&nbsp; 尽管is nil与is too long是两回事，validates_length_of :name, :maximum =&gt; 50 这个验证却不会通过。<br />
<br />
当然你可以指定:allow_nil =&gt; true, 但问题是有些属性不能为nil, 即是必须的属性,这时就会想到validates_presence_of,我们可以对上面的代码做改进：
<div class="code_title">ruby 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-rb" start="1">
    <li class="alt"><span><span class="keyword">class</span><span>&nbsp;User&nbsp;&lt;&nbsp;ActiveRecord::Base&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;validates_length_of&nbsp;<span class="symbol">:name</span><span>,&nbsp;</span><span class="symbol">:maximum</span><span>&nbsp;=&gt;&nbsp;50,&nbsp;&nbsp;</span><span class="symbol">:allow_nil</span><span>&nbsp;=&gt;&nbsp;</span><span class="keyword">true</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;validates_presence_of&nbsp;<span class="symbol">:name</span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="keyword">end</span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li>
</ol>
</div>
          <br/>
          <span style="color:red;">
            <a href="http://sean.javaeye.com/blog/131174#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 11 Oct 2007 17:30:32 +0800</pubDate>
        <link>http://sean.javaeye.com/blog/131174</link>
        <guid>http://sean.javaeye.com/blog/131174</guid>
      </item>
      <item>
        <title>组织controller的一个规则</title>
        <author>sean</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://sean.javaeye.com">sean</a>&nbsp;
          链接：<a href="http://sean.javaeye.com/blog/131090" style="color:red;">http://sean.javaeye.com/blog/131090</a>&nbsp;
          发表时间: 2007年10月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          进些天一直在读一本叫做RailssSpace(http://www.amazon.com/dp/0321480791)的书,其中有一个如何管理controller的规则觉得很有用，规则大致如下:<br />
<ol>
    <li>使用名词作为controller的名字；动词作为action的名字。例如:UserController中有login, logout, register, edit等actions.</li>
    <li>如果发现自己开始定义带有下划线, 尤其是&lt;verb&gt;_&lt;noun&gt;形式的action,&nbsp; 因该考虑针对noun建立一个新的controller, verb作为新的controller下的action。例如:不应该在UserController中定义了一个叫edit_spec 的action去编辑用户的specification, 而应该定义一个SpecController, 和相应的edit action.</li>
</ol>
如果你发现你的controller过于臃肿, 不知道哪些action该放到哪些controller中, 不知道是否该建立一个新的controller, 用用这个规则吧！
          <br/>
          <span style="color:red;">
            <a href="http://sean.javaeye.com/blog/131090#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 11 Oct 2007 15:43:29 +0800</pubDate>
        <link>http://sean.javaeye.com/blog/131090</link>
        <guid>http://sean.javaeye.com/blog/131090</guid>
      </item>
      <item>
        <title>&amp;&amp;的一种使用场景</title>
        <author>sean</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://sean.javaeye.com">sean</a>&nbsp;
          链接：<a href="http://sean.javaeye.com/blog/131077" style="color:red;">http://sean.javaeye.com/blog/131077</a>&nbsp;
          发表时间: 2007年10月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在ruby代码中经常看到这种使用||的idiom:
<div class="code_title">ruby 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-rb" start="1">
    <li class="alt"><span><span>a&nbsp;=&nbsp;a&nbsp;||&nbsp;b&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="comment">#&nbsp;or&nbsp;more&nbsp;concise:</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>a&nbsp;||=&nbsp;b&nbsp;&nbsp;</span></li>
</ol>
</div>
但是却很少看到使用&amp;&amp;的场景。如果你在一个方法中想返回一个表达式, 就像这样:
<div class="code_title">ruby 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-rb" start="1">
    <li class="alt"><span><span class="keyword">def</span><span>&nbsp;foo&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;bar.prop&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">end</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
上面的代码就有个问题, 如果bar对象为nil, 则上面的代码就会抛出错误.修改一下上面的代码:
<div class="code_title">ruby 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-rb" start="1">
    <li class="alt"><span><span class="keyword">def</span><span>&nbsp;foo&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;bar.<span class="keyword">nil</span><span>?&nbsp;?&nbsp;bar&nbsp;:&nbsp;bar.prop&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="keyword">end</span><span>&nbsp; <br />
    </span></span></li>
</ol>
</div>
不够简洁? &amp;&amp; rescued！
<div class="code_title">ruby 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-rb" start="1">
    <li class="alt"><span><span class="keyword">def</span><span>&nbsp;foo&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;bar&nbsp;&amp;&amp;&nbsp;bar.prop&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">end</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
          <br/>
          <span style="color:red;">
            <a href="http://sean.javaeye.com/blog/131077#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 11 Oct 2007 14:51:38 +0800</pubDate>
        <link>http://sean.javaeye.com/blog/131077</link>
        <guid>http://sean.javaeye.com/blog/131077</guid>
      </item>
      <item>
        <title>澄清对helper的一些错误认识</title>
        <author>sean</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://sean.javaeye.com">sean</a>&nbsp;
          链接：<a href="http://sean.javaeye.com/blog/130821" style="color:red;">http://sean.javaeye.com/blog/130821</a>&nbsp;
          发表时间: 2007年10月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          helper主要是帮助视图尽可能将代码从视图中隔离出来, 并提高视图之间代码的可重用性. 基于此, rails为我们做了一些&quot;连接&quot;工作:<br />
<ol>
    <li>每一个controller都对应一个helper module，例如对应UserController的是UserHelper, rails内部做了一些连接工作,使得默认每个controller下的所有视图都可以访问相应helper 的方法.</li>
    <li>rails内置一个全局helper:ApplicationHelper, rails内部做了一些连接工作,使得默认&ldquo;所有controller&rdquo;下的视图都可以访问ApplicationHelper下 的方法.</li>
</ol>
上面两条有时容易让人产生迷惑:<br />
<ol>
    <li>对于上面的第一条, 是不是每个controller本身也可以默认访问相应helper 的方法? 答案是不可以. 因为上面提到的helper是针对&ldquo;视图&rdquo;(而不是controller)提高代码隔离和重用的帮手, 所以默认只有视图才能访问到相应的helper的方法. 但是如果你有充分的理由要在controller中访问helper的方法, 你可以自己做:
    <div class="code_title">ruby 代码</div>
    <div class="dp-highlighter">
    <div class="bar">&nbsp;</div>
    <ol class="dp-rb" start="1">
        <li class="alt"><span><span class="keyword">class</span><span>&nbsp;UserController&nbsp;&lt;&nbsp;ApplicationController&nbsp;&nbsp;</span></span></li>
        <li class=""><span>&nbsp;&nbsp;&nbsp;include&nbsp;UserHelper&nbsp;&nbsp;</span></li>
        <li class="alt"><span><span class="keyword">end</span><span>&nbsp;&nbsp;</span></span></li>
    </ol>
    </div>
    <br />
    </li>
    <li>同理, 对于上面的第二条, 是不是所有controller也可以默认访问ApplicationHelper 的所有方法?答案同样是不可以,原因同上.如果一定要这么做，因为所有的controller都继承ApplicationController, 所以可以这样:
    <div class="code_title">ruby 代码</div>
    <div class="dp-highlighter">
    <div class="bar">&nbsp;</div>
    <ol class="dp-rb" start="1">
        <li class="alt"><span><span class="keyword">class</span><span>&nbsp;ApplicationController&nbsp;&lt;&nbsp;ActionController::Base&nbsp;&nbsp;</span></span></li>
        <li class=""><span>&nbsp;&nbsp;include&nbsp;ApplicationHelper&nbsp;&nbsp;</span></li>
        <li class="alt"><span><span class="keyword">end</span><span>&nbsp;&nbsp;</span></span></li>
    </ol>
    </div>
    <br />
    </li>
</ol>
有时我们可能想将某个controller的helper下的一些方法共享给其他controller，比如想将UserHelper下的一些方法共享给PhotoController下的所有视图, 其中一种方案是将UserHelper下的方法放到ApplicationHelper中, 这样所有的controller下的视图都能访问到这些方法.另外两种方案如下:<br />
<ol>
    <li>PhotoController include UserHelper:
    <div class="code_title">ruby 代码</div>
    <div class="dp-highlighter">
    <ol class="dp-rb" start="1">
        <li class="alt"><span><span class="keyword">class</span><span>&nbsp;PhotoController&nbsp;&lt;&nbsp;ApplicationController&nbsp;&nbsp;</span></span></li>
        <li class=""><span>&nbsp;&nbsp;&nbsp;include&nbsp;UserHelper&nbsp;&nbsp;</span></li>
        <li class="alt"><span><span class="keyword">end</span><span>&nbsp;&nbsp;</span></span></li>
    </ol>
    </div>
    </li>
    <li><span><span>使用helper方法
    <div class="code_title">ruby 代码</div>
    <div class="dp-highlighter">
    <div class="bar">&nbsp;</div>
    <ol class="dp-rb" start="1">
        <li class="alt"><span><span class="keyword">class</span><span>&nbsp;PhotoController&nbsp;&lt;&nbsp;ApplicationController&nbsp;&nbsp;</span></span></li>
        <li class=""><span>&nbsp;&nbsp;helper&nbsp;<span class="symbol">:user</span><span>&nbsp;&nbsp;</span></span></li>
        <li class="alt"><span><span class="keyword">end</span><span>&nbsp;&nbsp;</span></span></li>
    </ol>
    </div>
    <br />
    </span></span></li>
</ol>
这里容易使人产生迷惑的是这两种方法有什么不同:第一中方案会使PhotoController 和 其下的所有视图都能访问UserHelper的方法；而第二种方案仅会使PhotoController的所有视图能访问UserHelper的方法， 而PhotoController本身则不能。
          <br/>
          <span style="color:red;">
            <a href="http://sean.javaeye.com/blog/130821#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 10 Oct 2007 16:45:45 +0800</pubDate>
        <link>http://sean.javaeye.com/blog/130821</link>
        <guid>http://sean.javaeye.com/blog/130821</guid>
      </item>
      <item>
        <title>rails测试中的陷阱</title>
        <author>sean</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://sean.javaeye.com">sean</a>&nbsp;
          链接：<a href="http://sean.javaeye.com/blog/127306" style="color:red;">http://sean.javaeye.com/blog/127306</a>&nbsp;
          发表时间: 2007年09月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <ol>
    <li>在测试中访问cookie的值必须要用这种形式： cookies['key'].value.first， 例如cookies['auth_token'].value.first。这里应注意两点, 一是在测试中访问cookie必须要用String作为key, 不能用Symbol(在controller中既可以用String，也可以用Symbol)；二是要取得值必须调用value方法，但返回的是数组类型， 所以还要调用first方法。 </li>
    <li>有时我们在测试中想证明某个cookie值为nil, 我们可能这样写
    <div class="code_title">ruby 代码</div>
    <div class="dp-highlighter">
    <ol class="dp-rb">
        <li class="alt"><span><span>assert_nil&nbsp;cookies['auth_token'].value.first&nbsp;&nbsp;</span></span> </li>
    </ol>
    </div>
    如果你在被测代码中调用了cookies.delete 'auth_token' 时，上面的assert代码不会有问题， 但如果没有，上面的assert代码会抛出error， 因为这时cookies['auth_token']的值为nil。所以我们可以这样写上面的assert代码:
    <div class="code_title">ruby 代码</div>
    <div class="dp-highlighter">
    <ol class="dp-rb">
        <li class="alt"><span><span>assert_nil&nbsp;cookies['auth_token']&nbsp;&amp;&amp;&nbsp;cookies['auth_token'].value.first&nbsp;&nbsp;</span></span> </li>
    </ol>
    </div>
    </li>
    <li>下面是一段partial代码_password_field_row.rb（摘自RailsSpace）:
    <div class="code_title">ruby 代码</div>
    <div class="dp-highlighter">
    <div class="bar">&nbsp;</div>
    <ol class="dp-rb" start="1">
        <li class="alt"><span><span>&amp;lt;div&nbsp;</span><span class="keyword">class</span><span>=</span><span class="string">&quot;form_row&quot; &amp;gt;</span><span>&nbsp; <br />
        </span></span></li>
        <li class=""><span>&nbsp;&nbsp;</span></li>
        <li class="alt"><span>&nbsp;&nbsp;&lt;%=&nbsp;form.password_field&nbsp;field,&nbsp;<span class="symbol">:size</span><span>&nbsp;=&gt;&nbsp;User::PASSWORD_SIZE,&nbsp;</span><span class="symbol">:maxlength</span><span>&nbsp;=&gt;&nbsp;User::PASSWORD_MAX_LENGTH&nbsp;%&gt;&nbsp;&nbsp;</span></span></li>
        <li class=""><span>&amp;lt;/div&amp;gt; &nbsp;</span></li>
    </ol>
    </div>
    </li>
    <font color="#000000"><font>        </font></font></ol>
    <font color="#000000">                 在测试register.rhtml时会抛出error，大致意思是说在partial中变量field_title没有定义。这是因为在测试环境中如果在调用partial时不显示的标明field_title变量, 会认为field_title没有定义(在非测试环境中却没有这个问题)。可以用defined?方法解决这个问题&nbsp;     </font>
    <div class="code_title"><font color="#000000">ruby 代码</font></div>
    <font color="#000000">    </font>
    <div class="dp-highlighter"> <font color="#000000">    </font>
    <div class="bar"><font color="#000000">&nbsp;</font></div>
    <font color="#000000">    </font>
    <ol class="dp-rb" start="1"> <font color="#000000">
        <li class="alt"><span><span>&lt;%&nbsp;field_title&nbsp;=&nbsp;</span><span class="keyword">nil</span><span>&nbsp;</span><span class="keyword">if</span><span>&nbsp;</span><span class="keyword">not</span><span>&nbsp;</span><span class="keyword">defined</span><span>?(field_title)&nbsp;-%&gt;&nbsp;&nbsp;</span></span></li>
        <li class=""><span>&nbsp;&nbsp;</span></li>
        <li class="alt"><span></span></li>
        <li class=""><span>&nbsp;&nbsp;</span></li>
        <li class="alt"><span>&nbsp;&nbsp;&lt;%=&nbsp;form.password_field&nbsp;field,&nbsp;<span class="symbol">:size</span><span>&nbsp;=&gt;&nbsp;User::PASSWORD_SIZE,&nbsp;</span><span class="symbol">:maxlength</span><span>&nbsp;=&gt;&nbsp;User::PASSWORD_MAX_LENGTH&nbsp;%&gt;&nbsp;&nbsp;</span></span></li>
        <li class=""><span></span></li>
        </font></ol>
        <font color="#000000">    </font></div>
        <font color="#000000">    &nbsp;&nbsp;</font>
          <br/>
          <span style="color:red;">
            <a href="http://sean.javaeye.com/blog/127306#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 26 Sep 2007 14:57:47 +0800</pubDate>
        <link>http://sean.javaeye.com/blog/127306</link>
        <guid>http://sean.javaeye.com/blog/127306</guid>
      </item>
      <item>
        <title>ubuntu上安装Rmagic</title>
        <author>sean</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://sean.javaeye.com">sean</a>&nbsp;
          链接：<a href="http://sean.javaeye.com/blog/105459" style="color:red;">http://sean.javaeye.com/blog/105459</a>&nbsp;
          发表时间: 2007年07月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <ol>
    <li>安装ImageMagick
    <div class="code_title">ruby 代码</div>
    <div class="dp-highlighter">
    <ol class="dp-rb" start="1">
        <li class="alt"><span><span>sudo&nbsp;apt-get&nbsp;install&nbsp;imagemagick&nbsp;&nbsp;</span></span></li>
    </ol>
    </div>
    </li>
    <li><span><span>安装libmagick-dev, 首先看自己的'magick'包的版本号，然后根据相应的版本号安装相应的包。
    <div class="code_title">ruby 代码</div>
    <div class="dp-highlighter">
    <ol class="dp-rb" start="1">
        <li class="alt"><span><span>dpkg&nbsp;-l&nbsp;|&nbsp;grep&nbsp;magick&nbsp;&nbsp;</span></span></li>
        <li class=""><span>sudo&nbsp;apt-get&nbsp;install&nbsp;libmagick9-dev&nbsp;&nbsp;</span></li>
    </ol>
    </div>
    </span></span></li>
    <li><span><span><span>安装Rmagick
    <div class="code_title">ruby 代码</div>
    <div class="dp-highlighter">
    <ol class="dp-rb" start="1">
        <li class="alt"><span><span>sudo&nbsp;gem&nbsp;install&nbsp;rmagick&nbsp;&nbsp;</span></span></li>
    </ol>
    </div>
    <br />
    </span></span></span></li>
</ol>
          <br/>
          <span style="color:red;">
            <a href="http://sean.javaeye.com/blog/105459#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 25 Jul 2007 18:05:08 +0800</pubDate>
        <link>http://sean.javaeye.com/blog/105459</link>
        <guid>http://sean.javaeye.com/blog/105459</guid>
      </item>
      <item>
        <title>IBM T60上安装ubuntu</title>
        <author>sean</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://sean.javaeye.com">sean</a>&nbsp;
          链接：<a href="http://sean.javaeye.com/blog/105434" style="color:red;">http://sean.javaeye.com/blog/105434</a>&nbsp;
          发表时间: 2007年07月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          昨天晚上尝试在自己的IBM T60上安装Ubuntu 7.0, 安装过程十分简单，分区，一路回车，ok装完了，开始重启。<br />
这个时候问题来了，在启动的进度条走到五六个格的时候，突然停止了，硬盘灯也不闪了，我想这下废了。按了一下Ctrl+Alt+Delete, 本来是想重启动，没想到进度条开始动了，启动继续，顺利进入登录页面。<br />
<br />
心想是不是安装的过程有问题，于是又安装了一遍，结果问题依然存在。<br />
<br />
接着在启动停止的时候，按ALT+F1看了一下日志，
<div class="code_title">ruby 代码</div>
<div class="dp-highlighter">
<ol class="dp-rb" start="1">
    <li class="alt"><span><span>Loading,&nbsp;pease&nbsp;wait...&nbsp;&nbsp;</span></span></li>
    <li class=""><span>Kinit:&nbsp;name_to_dev_t(/dev/disk/by-uuid/3c7a8f65-b709-494a-92f1-318a38220def)=&nbsp;sda5(8,5)&nbsp;&nbsp;</span></li>
    <li class="alt"><span>kinit:&nbsp;No&nbsp;resume&nbsp;image,&nbsp;doing&nbsp;normal&nbsp;boot...&nbsp;&nbsp;</span></li>
</ol>
</div>
发现日志走到第三行的时候启动停止了，等了一会(大约一两分钟),启动继续。这说明不按Ctrl+Alt+Delete系统也能启动，但是要等很长时间。<br />
<br />
这时候有点绝望，但想起google又燃起了一丝希望！接着将上面的日志贴到了google上，发现这个问题还挺普遍，看了几个ubuntu官方论坛的帖子之后，终于找到解决办法：<a href="http://ubuntuforums.org/showthread.php?t=385869&amp;page=3">ubuntuforums.org/showthread.php</a><br />
<br />
这个问题很无线网络相关，首先备份一下<span><span>/etc/network/interfaces</span></span>
<div class="code_title">ruby 代码</div>
<div class="dp-highlighter">
<ol class="dp-rb" start="1">
    <li class="alt"><span><span>sudo&nbsp;cp&nbsp;/etc/network/interfaces&nbsp;/etc/network/interfaces.orig&nbsp;&nbsp;</span></span></li>
</ol>
</div>
然后修改<span><span>/etc/network/interfaces，修改后大致如下：<br />
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<ol class="dp-j" start="1">
    <li class="alt"><span><span>auto&nbsp;eth0&nbsp;&nbsp;</span></span></li>
    <li class=""><span>iface&nbsp;eth0&nbsp;inet&nbsp;dhcp&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>#auto&nbsp;eth1&nbsp;&nbsp;</span></li>
    <li class="alt"><span>#iface&nbsp;eth1&nbsp;inet&nbsp;dhcp&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>#auto&nbsp;eth2&nbsp;&nbsp;</span></li>
    <li class=""><span>#iface&nbsp;eth2&nbsp;inet&nbsp;dhcp&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>#auto&nbsp;ath0&nbsp;&nbsp;</span></li>
    <li class="alt"><span>#iface&nbsp;ath0&nbsp;inet&nbsp;dhcp&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>#auto&nbsp;wlan0&nbsp;&nbsp;</span></li>
    <li class=""><span>#iface&nbsp;wlan0&nbsp;inet&nbsp;dhcp&nbsp;&nbsp;</span></li>
</ol>
</div>
重启后问题解决！</span></span>
          <br/>
          <span style="color:red;">
            <a href="http://sean.javaeye.com/blog/105434#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 25 Jul 2007 17:03:28 +0800</pubDate>
        <link>http://sean.javaeye.com/blog/105434</link>
        <guid>http://sean.javaeye.com/blog/105434</guid>
      </item>
      <item>
        <title>console tips and tricks</title>
        <author>sean</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://sean.javaeye.com">sean</a>&nbsp;
          链接：<a href="http://sean.javaeye.com/blog/104439" style="color:red;">http://sean.javaeye.com/blog/104439</a>&nbsp;
          发表时间: 2007年07月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          一篇介绍console使用技巧的好文章：http://errtheblog.com/post/26<br />
<br />
除此之外,console可以运行在各种RAILS_ENV环境：<br />
<div class="code_title">ruby 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-rb" start="1">
    <li class="alt"><span><span class="comment">#默认运行在开发环境</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>ruby&nbsp;script/console&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span><span class="comment">#运行在测试环境</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>ruby&nbsp;script/console&nbsp;test&nbsp;&nbsp;</span></li>
</ol>
</div>
<br />
为了在console中让日志直接输出控制台，而不是日志文件中，修改~/.irbrc<br />
<div class="code_title">ruby 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-rb" start="1">
    <li class="alt"><span><span class="keyword">if</span><span>&nbsp;ENV.include?('RAILS_ENV')&nbsp;&amp;&amp;&nbsp;!</span><span class="builtin">Object</span><span>.const_defined?('RAILS_DEFAULT_LOGGER')&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;require&nbsp;'logger'&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="builtin">Object</span><span>.const_set('RAILS_DEFAULT_LOGGER',&nbsp;Logger.</span><span class="keyword">new</span><span>(STDOUT))&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="keyword">end</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
          <br/>
          <span style="color:red;">
            <a href="http://sean.javaeye.com/blog/104439#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 23 Jul 2007 15:14:35 +0800</pubDate>
        <link>http://sean.javaeye.com/blog/104439</link>
        <guid>http://sean.javaeye.com/blog/104439</guid>
      </item>
      <item>
        <title>巧用update_attribute</title>
        <author>sean</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://sean.javaeye.com">sean</a>&nbsp;
          链接：<a href="http://sean.javaeye.com/blog/103768" style="color:red;">http://sean.javaeye.com/blog/103768</a>&nbsp;
          发表时间: 2007年07月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          我当前的项目中有一个User model, 大体如下：<br />
<div class="code_title">ruby 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-rb" start="1">
    <li class="alt"><span><span class="keyword">class</span><span>&nbsp;User&nbsp;&lt;&nbsp;ActiveRecord::Base&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;validates_uniqueness_of&nbsp;<span class="symbol">:username</span><span>,&nbsp;</span><span class="symbol">:email</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="keyword">end</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
一般对user对象的修改主要有如下两种场景：<br />
<ol>
    <li>修改用户的基本信息，如email, nickname, ......</li>
    <li>当用户上传文件到自己的空间时，需要更新user的disk_used属性</li>
</ol>
本可以用如下代码完成disk_used属性的更新：<br />
<div class="code_title">ruby 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-rb" start="1">
    <li class="alt"><span><span class="comment">#&nbsp;uploading&nbsp;files&nbsp;....</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="comment">#&nbsp;calculating&nbsp;total&nbsp;file&nbsp;size.....</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>current_user.disk_used&nbsp;=&nbsp;current_user.disk_used&nbsp;+&nbsp;total_file_size&nbsp;&nbsp;</span></li>
    <li class=""><span>current_user.save&nbsp;&nbsp;</span></li>
</ol>
</div>
这段代码看起来好像没什么问题，但细想起来，每次user.save之前都要执行所有的validation, 对于一般的validation还可以接受，可是对于validates_uniqueness_of 这种validation很可能导致性能问题，众所周知，validates_uniqueness_of每次都要发出一次select请求, 更糟糕的是我们的应用中用户会频繁的上传文件。另一方面，每次只更新user的disk_used属性，并不需要执行所有的validation.<br />
<br />
这时候update_attribute派上用场了：
<div class="code_title">ruby 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-rb" start="1">
    <li class="alt"><span><span class="comment">#&nbsp;uploading&nbsp;files&nbsp;.....</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="comment">#&nbsp;calculating&nbsp;total_file_size....</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>current_user.update_attribute(<span class="symbol">:disk_used</span><span>,&nbsp;current_user.disk_used&nbsp;+&nbsp;total_file_size)&nbsp;&nbsp;</span></span></li>
</ol>
</div>
上面的代码不但提升了性能，而且更加简洁，更重的是它使得代码的意图更加清晰：只更新disk_used属性（区别于修改用户基本信息的场景）。我们可以更近一步使代码更加清晰：<br />
<div class="code_title">ruby 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-rb" start="1">
    <li class="alt"><span><span class="keyword">class</span><span>&nbsp;User&nbsp;&lt;&nbsp;ActiveRecord::Base&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;<span class="keyword">def</span><span>&nbsp;increase_disk_used(file_size)&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;update_attribute(<span class="symbol">:disk_used</span><span>,&nbsp;disk_used&nbsp;+&nbsp;file_size)&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="keyword">end</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="comment">#uploading&nbsp;files&nbsp;....</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="comment">#calculating&nbsp;total_file_size</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>current_user.increase_disk_used(total_file_size)&nbsp;&nbsp;</span></li>
</ol>
</div>
          <br/>
          <span style="color:red;">
            <a href="http://sean.javaeye.com/blog/103768#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 21 Jul 2007 14:32:00 +0800</pubDate>
        <link>http://sean.javaeye.com/blog/103768</link>
        <guid>http://sean.javaeye.com/blog/103768</guid>
      </item>
      <item>
        <title>在pseudo-model中使用logger</title>
        <author>sean</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://sean.javaeye.com">sean</a>&nbsp;
          链接：<a href="http://sean.javaeye.com/blog/97422" style="color:red;">http://sean.javaeye.com/blog/97422</a>&nbsp;
          发表时间: 2007年07月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          用rubyonrails开发已有三个月左右, 还没有在model中使用过logger.今天碰巧需要在一个pseudo-model(不继承ActiveRecord::Base, 即不对应数据库中的表)中使用logger, 突然不知道应该从哪里获取logger.如果在Controller和Model的方法中, 可以直接引用logger, 例如:<br />
<div class="code_title">ruby 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-rb" start="1">
    <li class="alt"><span><span class="comment">#&nbsp;use&nbsp;logger&nbsp;in&nbsp;controller</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="keyword">class</span><span>&nbsp;ProductsController&nbsp;&lt;&nbsp;ApplicationController&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">def</span><span>&nbsp;index&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.info&nbsp;'index&nbsp;action....'&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">end</span><span>&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="comment">#&nbsp;use&nbsp;logger&nbsp;in&nbsp;model</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="keyword">class</span><span>&nbsp;Product&nbsp;&lt;&nbsp;ActiveRecord::Base&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">def</span><span>&nbsp;products_on_sale&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.info&nbsp;<span class="string">&quot;products_on_sale&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="keyword">end</span><span>&nbsp;&nbsp;&nbsp;</span></span></li>
</ol>
</div>
看了一下<a href="http://wiki.rubyonrails.org/rails/pages/HowtoConfigureLogging">wiki.rubyonrails.org/rails/pages/HowtoConfigureLogging</a> ，基本明白了rails中logger工作原理:<br />
logger的配置是由environment.rb初始化完成的,主要有两个步骤,<br />
首先为整个rails环境定义了一个默认的全局logger:<br />
<div class="code_title">ruby 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-rb" start="1">
    <li class="alt"><span><span class="keyword">begin</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;RAILS_DEFAULT_LOGGER&nbsp;=&nbsp;Logger.<span class="keyword">new</span><span>(</span><span class="string">&quot;#{RAILS_ROOT}/log/#{RAILS_ENV}.log&quot;</span><span>)&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="keyword">rescue</span><span>&nbsp;StandardError&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;RAILS_DEFAULT_LOGGER&nbsp;=&nbsp;Logger.<span class="keyword">new</span><span>(STDERR)&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;RAILS_DEFAULT_LOGGER.level&nbsp;=&nbsp;Logger::WARN&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;RAILS_DEFAULT_LOGGER.warn(&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">&quot;Rails&nbsp;Error:&nbsp;Unable&nbsp;to&nbsp;access&nbsp;log&nbsp;file.&nbsp;Please&nbsp;ensure&nbsp;that&nbsp;log/#{RAILS_ENV}.log&nbsp;exists&nbsp;and&nbsp;is&nbsp;chmod&nbsp;0666.&nbsp;&quot;</span><span>&nbsp;+&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">&quot;The&nbsp;log&nbsp;level&nbsp;has&nbsp;been&nbsp;raised&nbsp;to&nbsp;WARN&nbsp;and&nbsp;the&nbsp;output&nbsp;directed&nbsp;to&nbsp;STDERR&nbsp;until&nbsp;the&nbsp;problem&nbsp;is&nbsp;fixed.&quot;</span><span>&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;)&nbsp;&nbsp;</span></li>
    <li class=""><span><span class="keyword">end</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<br />
接着将这个logger<span>分别分配给rails中的主要的components: ActiveRecord, ActionController, ActionMailer<br />
<div class="code_title">ruby 代码</div>
<div class="dp-highlighter">
<ol class="dp-rb" start="1">
    <li class="alt"><span><span>[ActiveRecord,&nbsp;ActionController,&nbsp;ActionMailer].</span><span class="keyword">each</span><span>&nbsp;{&nbsp;</span><span class="variable">|mod</span><span>|&nbsp;mod::Base.logger&nbsp;||=&nbsp;RAILS_DEFAULT_LOGGER&nbsp;}&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<br />
根据以上原理, 我们可以得出结论:<br />
<br />
</span>
<ol>
    <li><span><strong>在ActiveRecord/ActionController/ActionMailer中我们可以直接引用logger(如上面代码所示)</strong></span></li>
    <li><span><strong>在除这些rails主要的component之外的类中,可以直接引用全局常量</strong></span><span>:<u>RAILS_DEFAULT_LOGGER,</u>例如:</span></li>
</ol>
<span>
<div class="code_title">ruby 代码</div>
<div class="dp-highlighter">
<ol class="dp-rb" start="1">
    <li class="alt"># this is a pseudo-model class, so it does not associate with any specific rails class<span><span class="keyword"></span></span></li>
    <li class="alt"><span><span class="keyword">class</span><span>&nbsp;CartItem&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;<span class="keyword">def</span><span>&nbsp;price&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RAILS_DEFAULT_LOGGER.info&nbsp;'<span class="keyword">in</span><span>&nbsp;price&nbsp;method'&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="keyword">end</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<u><br />
</u></span>
          <br/>
          <span style="color:red;">
            <a href="http://sean.javaeye.com/blog/97422#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 03 Jul 2007 22:51:00 +0800</pubDate>
        <link>http://sean.javaeye.com/blog/97422</link>
        <guid>http://sean.javaeye.com/blog/97422</guid>
      </item>
  </channel>
</rss>