<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>chq (cuihq)</title>
    <link>https://ruby-china.org/chq</link>
    <description></description>
    <language>en-us</language>
    <item>
      <title>Ruby 版本常量</title>
      <description>&lt;h2 id="说明"&gt;说明&lt;/h2&gt;
&lt;p&gt;在 MRI 1.9 以上的版本中，有一些&lt;a href="http://ruby-doc.org/core-2.2.3/Object.html" rel="nofollow" target="_blank" title=""&gt;&lt;code&gt;Object&lt;/code&gt;类&lt;/a&gt;中定义的常量，说明了 Ruby 的版本和平台等信息。&lt;/p&gt;
&lt;table class="table table-bordered table-striped"&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;th&gt;常量&lt;/th&gt;
&lt;th&gt;含义&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RUBY_DESCRIPTION&lt;/td&gt;
&lt;td&gt;和命令行输入&lt;code&gt;ruby -v prints&lt;/code&gt;是一样的效果，由表中下列常量组成&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RUBY_ENGINE&lt;/td&gt;
&lt;td&gt;使用的解释器引擎&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RUBY_VERSION&lt;/td&gt;
&lt;td&gt;运行的版本号&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RUBY_PATCHLEVEL&lt;/td&gt;
&lt;td&gt;补丁版本号，1.8 也有这个常量&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RUBY_RELEASE_DATE&lt;/td&gt;
&lt;td&gt;发布日期，1.8 也有这个常量&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RUBY_REVISION&lt;/td&gt;
&lt;td&gt;SVN 版本号&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RUBY_PLATFORM&lt;/td&gt;
&lt;td&gt;OS 平台，1.8 也有这个常量&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;使用 RVM 查看 MRI1.8 以上的各个版本对这些常量的兼容性：&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;rvm all &lt;span class="k"&gt;do &lt;/span&gt;ruby &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s1"&gt;'puts "#{RUBY_ENGINE} #{RUBY_VERSION}p#{RUBY_PATCHLEVEL} (#{RUBY_RELEASE_DATE} revision #{RUBY_REVISION}) [#{RUBY_PLATFORM}]"'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;解释下上面的命令：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;rvm all do ...&lt;/code&gt;是依次切换到已经安装 ruby 各个版本的环境下运行相关命令；&lt;/li&gt;
&lt;li&gt;ruby -e '...' 是使用 ruby 解析器运行一条&lt;code&gt;...&lt;/code&gt;的 ruby 语句；&lt;/li&gt;
&lt;li&gt;puts "..."是在终端的标准输出中打印 Ruby 版本常量。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;结果为：&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;ruby 1.9.1p431 (2011-02-18 revision 30908) [x86_64-linux]
ruby 2.2.0p0 (2014-12-25 revision 49005) [x86_64-linux]
ruby 2.2.1p85 (2015-02-26 revision 49769) [x86_64-linux]
ruby 1.9.3p551 (2014-11-13 revision 48407) [x86_64-linux]
ruby 2.1.5p273 (2014-11-13 revision 48405) [x86_64-linux]
ruby 2.0.0p643 (2015-02-25 revision 49749) [x86_64-linux]
ruby 1.9.2p330 (2014-08-07 revision 47094) [x86_64-linux]&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;因为 rvm 安装的 ruby 和平台不同，结果也可能不一样。&lt;/p&gt;
&lt;h2 id="例子"&gt;例子&lt;/h2&gt;
&lt;p&gt;通过这些常量，可以：&lt;/p&gt;
&lt;h3 id="1.  不同的平台加载不同的代码或者GEM包，兼容各个平台；"&gt;1.  不同的平台加载不同的代码或者 GEM 包，兼容各个平台；&lt;/h3&gt;
&lt;p&gt;如 select IO 的&lt;a href="https://github.com/eventmachine/eventmachine/blob/master/lib/eventmachine.rb" rel="nofollow" target="_blank" title=""&gt;eventmachine&lt;/a&gt;：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# 省略代码...&lt;/span&gt;
&lt;span class="k"&gt;elsif&lt;/span&gt; &lt;span class="no"&gt;RUBY_PLATFORM&lt;/span&gt; &lt;span class="o"&gt;=~&lt;/span&gt; &lt;span class="sr"&gt;/java/&lt;/span&gt;
  &lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'java'&lt;/span&gt;
  &lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'jeventmachine'&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;
  &lt;span class="c1"&gt;# 省略代码...&lt;/span&gt;
    &lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'rubyeventmachine'&lt;/span&gt;
  &lt;span class="c1"&gt;# 省略代码...&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;根据不同的平台加载不同的事件驱动引擎，使用 Java JVM 平台会加载 JRUBY 的，否则加载 ruby 的。&lt;/p&gt;
&lt;h3 id="2.  不同的版本，打一些猴子补丁或者补丁代码，以兼容各个版本；"&gt;2.  不同的版本，打一些猴子补丁或者补丁代码，以兼容各个版本；&lt;/h3&gt;
&lt;p&gt;如用于心跳检测的&lt;a href="https://github.com/mojombo/god/blob/master/lib/god.rb" rel="nofollow" target="_blank" title=""&gt;god&lt;/a&gt;:&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# 省略代码...&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="no"&gt;RUBY_VERSION&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="s1"&gt;'1.9'&lt;/span&gt;
  &lt;span class="vg"&gt;$KCODE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'u'&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="c1"&gt;# 省略代码...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在 ruby 1.8 的版本中，不是在文件头部加入&lt;code&gt;# coding: utf-8&lt;/code&gt;，而是使用全局变量$KCODE 来判断 ruby 文件编码的&lt;/p&gt;
&lt;h3 id="3.  检测平台或者版本，只有符合条件才运行程序；"&gt;3.  检测平台或者版本，只有符合条件才运行程序；&lt;/h3&gt;
&lt;p&gt;如 &lt;a href="https://github.com/rails/rails/blob/master/railties/lib/rails/ruby_version_check.rb" rel="nofollow" target="_blank" title=""&gt;rails&lt;/a&gt;：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="no"&gt;RUBY_VERSION&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="s1"&gt;'2.2.2'&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="no"&gt;RUBY_ENGINE&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;'ruby'&lt;/span&gt;
  &lt;span class="c1"&gt;# 省略代码...&lt;/span&gt;
  &lt;span class="nb"&gt;abort&lt;/span&gt; &lt;span class="c1"&gt;# 省略代码...&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;正在开发的代码仅仅支持 ruby 2.2.2 以上的版本，如果使用小于这个版本的 ruby 解析器，会打印一串提示信息后，退出程序。&lt;/p&gt;
&lt;h2 id="BTW:"&gt;BTW:&lt;/h2&gt;
&lt;p&gt;对于一些人，然并卵。
一般情况下，了解这些就够用了。
如果高手觉得不够用（这不在本文的范围内），想获取更详细的信息，可以调用下面的 ruby 代码。&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="no"&gt;RbConfig&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;CONFIG&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;没有文档，具体用法请查看 ruby ext/extmk.rb源文件。&lt;/p&gt;</description>
      <author>chq</author>
      <pubDate>Tue, 25 Aug 2015 18:03:36 +0800</pubDate>
      <link>https://ruby-china.org/topics/27077</link>
      <guid>https://ruby-china.org/topics/27077</guid>
    </item>
    <item>
      <title>[求助] 文件上传的测试代码怎么写</title>
      <description>&lt;p&gt;在测试 Controller 的 create 方法时，需要对表单中的文件上传进行测试，模型和视图如下：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Picture&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;ActiveRecord&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Base&lt;/span&gt;
  &lt;span class="n"&gt;mount_uploader&lt;/span&gt; &lt;span class="ss"&gt;:image&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;PictureUploader&lt;/span&gt; &lt;span class="c1"&gt;#carrierwave上传&lt;/span&gt;
  &lt;span class="n"&gt;validates&lt;/span&gt; &lt;span class="ss"&gt;:image&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;presence: &lt;/span&gt;&lt;span class="kp"&gt;true&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight erb"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;%=&lt;/span&gt; &lt;span class="n"&gt;form_for&lt;/span&gt; &lt;span class="vi"&gt;@picture&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;html: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;multipart: &lt;/span&gt;&lt;span class="kp"&gt;true&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="cp"&gt;%&amp;gt;&lt;/span&gt;
  &lt;span class="cp"&gt;&amp;lt;%=&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;label&lt;/span&gt; &lt;span class="ss"&gt;:image&lt;/span&gt; &lt;span class="cp"&gt;%&amp;gt;&lt;/span&gt;
  &lt;span class="cp"&gt;&amp;lt;%=&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;file_field&lt;/span&gt; &lt;span class="ss"&gt;:image&lt;/span&gt; &lt;span class="cp"&gt;%&amp;gt;&lt;/span&gt;
&lt;span class="cp"&gt;&amp;lt;%&lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="cp"&gt;%&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;测试代码如下&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PicturesControllerTest&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;ActionController&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;TestCase&lt;/span&gt;
  &lt;span class="c1"&gt;#...&lt;/span&gt;
  &lt;span class="nb"&gt;test&lt;/span&gt; &lt;span class="s2"&gt;"should create picture"&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="n"&gt;post&lt;/span&gt; &lt;span class="ss"&gt;:create&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;picture: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="ss"&gt;image: &lt;/span&gt;&lt;span class="n"&gt;xxx&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="c1"&gt;#怎样写这部分的测试代码&lt;/span&gt;
    &lt;span class="n"&gt;assert_redirected_to&lt;/span&gt; &lt;span class="n"&gt;picture_path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;assigns&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:picture&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;如题，怎样写文件上传的测试代码，或者思路 (http 协议/carrierwave 上传)&lt;/strong&gt;，进行测试呢？&lt;/p&gt;</description>
      <author>chq</author>
      <pubDate>Sat, 16 Aug 2014 23:47:00 +0800</pubDate>
      <link>https://ruby-china.org/topics/21057</link>
      <guid>https://ruby-china.org/topics/21057</guid>
    </item>
  </channel>
</rss>
