﻿<?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-定义世界-随笔分类-Rails, Rails, Rails</title><link>http://www.blogjava.net/gsofhon/category/30808.html</link><description>摆动的时钟挥动死神之镰</description><language>zh-cn</language><lastBuildDate>Mon, 14 Apr 2008 17:50:16 GMT</lastBuildDate><pubDate>Mon, 14 Apr 2008 17:50:16 GMT</pubDate><ttl>60</ttl><item><title>Rails: with_options (Object)</title><link>http://www.blogjava.net/gsofhon/archive/2008/02/23/181642.html</link><dc:creator>光荣之翼</dc:creator><author>光荣之翼</author><pubDate>Sat, 23 Feb 2008 12:58:00 GMT</pubDate><guid>http://www.blogjava.net/gsofhon/archive/2008/02/23/181642.html</guid><wfw:comment>http://www.blogjava.net/gsofhon/comments/181642.html</wfw:comment><comments>http://www.blogjava.net/gsofhon/archive/2008/02/23/181642.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gsofhon/comments/commentRss/181642.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gsofhon/services/trackbacks/181642.html</trackback:ping><description><![CDATA[<p>with_options是ActiveSupport为Object类型扩展的一个方法，其作用是为代码块中所有的调用添加一些公共的参数。一个来自Beast的例子如下：</p>
<pre>  with_options :<span style="color: #0000ff;">if</span> =&gt; :password_required? <span style="color: #0000ff;">do</span> |u|<br />
u.validates_presence_of     :password_hash<br />
u.validates_length_of       :password, :minimum =&gt; 5, :allow_nil =&gt; <span style="color: #0000ff;">true</span>
u.validates_confirmation_of :password, :on =&gt; :create
u.validates_confirmation_of :password, :on =&gt; :update, :allow_nil =&gt; <span style="color: #0000ff;">true</span>
<span style="color: #0000ff;">end</span></pre>
<p>其作用是为代码段中的每一个调用都添加一个&#8220;:if =&gt; :password_required?&#8221;参数。</p>
<p>with_options的源代码如下：</p>
<pre>    <span style="color: #008000;"># File vendor/rails/activesupport/lib/active_support/core_ext/object/misc.rb, line 47</span>
47:   <span style="color: #0000ff;">def</span> with_options(options)<br />
48:     <span style="color: #0000ff;">yield</span> ActiveSupport::OptionMerger.new(<span style="color: #0000ff;">self</span>, options)<br />
49:   <span style="color: #0000ff;">end</span></pre>
<p>也就是说，他会返回一个OptionMerger对象，将当前的对象包装起来，并传递给你的代码段。</p>
<p>OptionMerger代码如下：</p>
<pre><span style="color: #008000;"># File G:\ruby\lib\ruby\gems\1.8\gems\activesupport-1.4.4\lib\active_support\option_merger.rb</span>
<span style="color: #0000ff;">module</span> ActiveSupport<br />
<span style="color: #0000ff;">class</span> OptionMerger <span style="color: #008000;">#:nodoc:</span>
instance_methods.each <span style="color: #0000ff;">do</span> |method| <br />
undef_method(method) <span style="color: #0000ff;">if</span> method !~ /^(__|instance_eval|<span style="color: #0000ff;">class</span>)/<br />
<span style="color: #0000ff;">end</span>
<span style="color: #0000ff;">def</span> initialize(context, options)<br />
@context, @options = context, options<br />
<span style="color: #0000ff;">end</span>
private
<span style="color: #0000ff;">def</span> method_missing(method, *arguments, &amp;block)<br />
merge_argument_options! arguments<br />
@context.send(method, *arguments, &amp;block)<br />
<span style="color: #0000ff;">end</span>
<span style="color: #0000ff;">def</span> merge_argument_options!(arguments)<br />
arguments &lt;&lt; <span style="color: #0000ff;">if</span> arguments.last.respond_to? :to_hash<br />
@options.merge(arguments.pop)<br />
<span style="color: #0000ff;">else</span>
@options.dup
<span style="color: #0000ff;">end</span>  <br />
<span style="color: #0000ff;">end</span>
<span style="color: #0000ff;">end</span>
<span style="color: #0000ff;">end</span></pre>
<p>OptionMerger的主要目的是包装当前对象。网上一篇文档说OptionMerger使用了Decorator模式，无奈没仔细研究过设计模式&#8230;&#8230;。可以看到在代码最初的部分首先删除了对象的所有instance_method，后面可以看到对所有的方法的执行都是重新定向到@context对象的，也就是上面传递过来的self。难道这就是Decorator模式？</p>
<p>在构造函数里面首先得到被包装的对象@context以及你提供的需要添加到所有调用中的参数。因为最终返回的是一个OptionMerger对象，又由于所有的instance_method都被删除了，因此任何一个调用都会引发异常。在下面的代码可以看到，通过实现method_missing函数，ruby直接处理了异常，并把对参数的调用传递给method_missing函数，包括名称，参数以及代码段。说到这里基本就没有难度了，method_missing把你提供的公共参数加入到参数列表中，然后调用context的相应的方法，实现包装。</p>
<p>哎&#8230;&#8230;不看代码好多年&#8230;&#8230;</p>
<img src ="http://www.blogjava.net/gsofhon/aggbug/181642.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gsofhon/" target="_blank">光荣之翼</a> 2008-02-23 20:58 <a href="http://www.blogjava.net/gsofhon/archive/2008/02/23/181642.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>解决Rails的乱码问题</title><link>http://www.blogjava.net/gsofhon/archive/2008/01/25/177774.html</link><dc:creator>光荣之翼</dc:creator><author>光荣之翼</author><pubDate>Fri, 25 Jan 2008 07:43:00 GMT</pubDate><guid>http://www.blogjava.net/gsofhon/archive/2008/01/25/177774.html</guid><wfw:comment>http://www.blogjava.net/gsofhon/comments/177774.html</wfw:comment><comments>http://www.blogjava.net/gsofhon/archive/2008/01/25/177774.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gsofhon/comments/commentRss/177774.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gsofhon/services/trackbacks/177774.html</trackback:ping><description><![CDATA[<p>适用于Ruby 1.8.6-26以及Rails 1.2.6。</p>
<p>第一次正式研究Rails，首先攻克的问题就是编码问题。解决方法如下：</p>
<p>Rails方面配置：</p>
<ol>
    <li>Updated at 2008-03-19<br />
    编辑文件 config/environment.rb，在第一行加入下面的语句：<br />
    $KCODE = 'u'<br />
    require 'jcode' </li>
    <li>网站app/controller文件夹下，application.rb，添加如下代码：<br />
    before_filter :configure_charsets <br />
    def configure_charsets<br />
    &nbsp; @headers["Content-Type"] = "text/html; charset=utf-8"<br />
    end  </li>
    <li>网站config文件夹下，database.yml，为每一个数据库添加如下配置：<br />
    encoding: utf8 </li>
</ol>
<p>另外，确保每一个rhtml的header部分被正确的配置。</p>
<p>&lt;meta http-equiv="content-type" content="text/html;charset=utf-8" /&gt;</p>
<p>确保包含中文的rb文件和rhtml文件使用UTF-8编码（无BOM）格式保存。</p>
<p>数据库方面配置：</p>
<p>mysql应该使用utf8编码。</p>
<p>令，在fedora下时，由于自带的mysql在安装的时候是不能更改字符集的，因此需要在安装之后调整字符集。编辑/etc/my.cnf，在每一个配置节点下添加default-character-set=utf8，重新启动mysql，并且重新创建需要的数据库，运行数据迁移任务即可。如果直接修改字符集不而不重新创建数据库则无效。</p>
<img src ="http://www.blogjava.net/gsofhon/aggbug/177774.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gsofhon/" target="_blank">光荣之翼</a> 2008-01-25 15:43 <a href="http://www.blogjava.net/gsofhon/archive/2008/01/25/177774.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>