<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>reyesyang</title>
    <link>https://ruby-china.org/reyesyang</link>
    <description>Pragmatic Programmer</description>
    <language>en-us</language>
    <item>
      <title>Rails 4.1.5 开始 where 查询也有类似 Mass Assignment 保护了</title>
      <description>&lt;p&gt;前两天将项目中的 Rails 生到了 4.1.5，跑了测试发现有几个查询相关的用例抛出了  ActiveModel::ForbiddenAttributesError 的异常，这个异常大家很熟悉，是防止 Mass Assignment 而在 Rails 4 中引入的一种保护机制。但是常用在创建或更新对象的逻辑中，突然在查询相关逻辑中抛出这样的异常，还是有些莫名奇妙。&lt;/p&gt;

&lt;p&gt;根据异常栈查看类 Rails 的源码，发现 4.1.5 where 查询确实进行了更新，新增了 &lt;code&gt;opts = sanitize_forbidden_attributes(opts)&lt;/code&gt; 这步，而 sanitize_forbidden_attributes 本身就是 sanitize_for_mass_assignment 方法的别名。如下：&lt;/p&gt;

&lt;p&gt;Rails 4.1.5&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# https://github.com/rails/rails/blob/v4.1.5/activerecord/lib/active_record/relation/query_methods.rb#L563&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;where!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;opts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="ss"&gt;:chain&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;rest&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# :nodoc:&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;opts&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="ss"&gt;:chain&lt;/span&gt;
    &lt;span class="no"&gt;WhereChain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;else&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="no"&gt;Hash&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="n"&gt;opts&lt;/span&gt;
      &lt;span class="n"&gt;opts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sanitize_forbidden_attributes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="n"&gt;references!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;PredicateBuilder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;references&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;

    &lt;span class="nb"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;where_values&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;build_where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rest&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nb"&gt;self&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="c1"&gt;# https://github.com/rails/rails/blob/v4.1.5/activemodel/lib/active_model/forbidden_attributes_protection.rb#L26&lt;/span&gt;
&lt;span class="k"&gt;alias&lt;/span&gt; &lt;span class="ss"&gt;:sanitize_forbidden_attributes&lt;/span&gt; &lt;span class="ss"&gt;:sanitize_for_mass_assignment&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Rails 4.1.4&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# https://github.com/rails/rails/blob/v4.1.4/activerecord/lib/active_record/relation/query_methods.rb#L560&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;where!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;opts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="ss"&gt;:chain&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;rest&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# :nodoc:&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;opts&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="ss"&gt;:chain&lt;/span&gt;
    &lt;span class="no"&gt;WhereChain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;else&lt;/span&gt;
    &lt;span class="n"&gt;references!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;PredicateBuilder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;references&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="no"&gt;Hash&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="n"&gt;opts&lt;/span&gt;

    &lt;span class="nb"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;where_values&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;build_where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rest&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nb"&gt;self&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;code&gt;conditions = params.slice(:ua, :sdk)&lt;/code&gt; 改为 &lt;code&gt;conditions = params.permit(:ua, :sdk)&lt;/code&gt;。其实两者的目的是一样的，防止用户自己构造表单查询本没有权限查看的内容。所以 Rails 也算是强制统一了读写操作中对 params 的限制措施。&lt;/p&gt;</description>
      <author>reyesyang</author>
      <pubDate>Mon, 15 Sep 2014 18:08:32 +0800</pubDate>
      <link>https://ruby-china.org/topics/21540</link>
      <guid>https://ruby-china.org/topics/21540</guid>
    </item>
    <item>
      <title>掉到 Array 链式调用的坑里了</title>
      <description>&lt;p&gt;今天代码里面写了个数组链式调用，大意如下：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;uniq!&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reject!&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;    &lt;span class="c1"&gt;#=&amp;gt; [1,3]&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="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;uniq!&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reject!&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;    &lt;span class="c1"&gt;#=&amp;gt;NoMethodError: undefined method `reject!' for nil:NilClass&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;查了文档才发现 uniq! 会在数组没有重复元素时直接返回 nil。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;reject! { |item| block } → ary or nil
reject! → Enumerator
Equivalent to #delete_if, deleting elements from self for which the block evaluates to &amp;gt; true, &lt;strong&gt;but returns nil if no changes were made&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;想当然为了简化代码写了链式调用，看来以后使用前得好好读读官方文档了。 &lt;/p&gt;</description>
      <author>reyesyang</author>
      <pubDate>Thu, 23 May 2013 14:00:16 +0800</pubDate>
      <link>https://ruby-china.org/topics/11185</link>
      <guid>https://ruby-china.org/topics/11185</guid>
    </item>
    <item>
      <title>手把手安装 RVM 以及为什么 RVM is not a function</title>
      <description>&lt;p&gt;前两天买了块 SSD，所以重装了系统，作为一名光荣的 RoR 开发人员，RVM 少不了，在重装 RVM 的过程中就遇到了一点问题。&lt;/p&gt;
&lt;h2 id="貌似顺利的安装"&gt;貌似顺利的安装&lt;/h2&gt;
&lt;p&gt;按照官方文档 [‘Installing RVM’][1]，我以单用户模式安装 (Single-User installations)：&lt;/p&gt;
&lt;h2 id="1. Download and run the RVM installation script"&gt;1. Download and run the RVM installation script&lt;/h2&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-L&lt;/span&gt; get.rvm.io | bash &lt;span class="nt"&gt;-s&lt;/span&gt; stable
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;一切顺利的话，会自动下载 RVM 的安装脚本并进行安装。成功后终端中会有很多&lt;strong&gt;无用输出&lt;/strong&gt;(后面有逆袭)。&lt;/p&gt;
&lt;h2 id="2. Load RVM into your shell sessions as a function"&gt;2. Load RVM into your shell sessions as a function&lt;/h2&gt;
&lt;p&gt;引用官方文档：&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Single-User&lt;/strong&gt;:
The rvm function will be automatically configured for every user on the system if you install as single user. Read the output of installer to check which files were modified.&lt;/p&gt;

&lt;p&gt;按照我当时的理解，这里没有给任何需要运行的命令，然后就&lt;strong&gt;天真&lt;/strong&gt;的以为不需要配置，进行下一步。&lt;/p&gt;
&lt;h2 id="3. Reload shell configuration &amp;amp; test"&gt;3. Reload shell configuration &amp;amp; test&lt;/h2&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;source&lt;/span&gt; ~/.rvm/script/rvm
&lt;span class="nb"&gt;type &lt;/span&gt;rvm | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; 1 &lt;span class="c"&gt;# rvm is a function&lt;/span&gt;
rvm requirement
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这些命令运行都健康通过，然后在同一个终端中继续下一步：&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;rvm &lt;span class="nb"&gt;install &lt;/span&gt;1.9.3
&lt;span class="nb"&gt;cd &lt;/span&gt;path/to/my/rails/project
bundle &lt;span class="nb"&gt;install
&lt;/span&gt;rails s
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;都顺利通过。Ok，大功告成。&lt;/p&gt;
&lt;h2 id="突然就悲剧了"&gt;突然就悲剧了&lt;/h2&gt;&lt;h2 id="1. 症状"&gt;1. 症状&lt;/h2&gt;
&lt;p&gt;由于种种原因，你总会关掉现在的终端而另开一个，这时再进入项目文件夹执行&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;rails s
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;发现了错误提示&lt;/p&gt;

&lt;p&gt;The program 'rails' is currently not installed.  You can install it by typing:
sudo apt-get install rails&lt;/p&gt;

&lt;p&gt;很诡异呀，一路按照官方文档安装都很顺利，为什么重开个终端就不行了？这时再执行：&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;rvm use
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;应该会有类似下面的提示：&lt;/p&gt;

&lt;p&gt;RVM is not a function, selecting rubies with 'rvm use ...' will not work.
You need to change your terminal settings to allow shell login.
Please visit &lt;a href="https://rvm.io/workflow/screen/" rel="nofollow" target="_blank"&gt;https://rvm.io/workflow/screen/&lt;/a&gt; for example.&lt;/p&gt;
&lt;h2 id="2. 初步修复"&gt;2. 初步修复&lt;/h2&gt;
&lt;p&gt;其实上面的错误提示已经很明显了：&lt;/p&gt;

&lt;p&gt;You need to change your terminal settings to allow shell login.&lt;/p&gt;

&lt;p&gt;将 Ubuntu 的 Gnome Terminal 改为以 login shell 运行，可参考 [Integrating RVM with gnome-terminal][2]。
现在关掉现有终端重开一个或者在现有终端中执行：&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bash &lt;span class="nt"&gt;--login&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后运行：&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;rvm use
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;一切都又正常了，程旭猿们又过上了和谐安康的 code 生活。&lt;/p&gt;
&lt;h2 id="Dig More"&gt;Dig More&lt;/h2&gt;
&lt;p&gt;上面确实解决了 RVM 的问题，但难免有些疑问：&lt;/p&gt;
&lt;h2 id="为什么改为login shell RVM就正常了?"&gt;为什么改为 login shell RVM 就正常了？&lt;/h2&gt;
&lt;p&gt;这个还要从我们的安装步骤说起，温习官方文档第二步：
Load RVM into your shell sessions as a function&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Single-User&lt;/strong&gt;:
The rvm function will be automatically configured for every user on the system if you install as single user. Read the output of installer to check which files were modified.&lt;/p&gt;

&lt;p&gt;虽然这里没有给出任何明确命令让我们执行，但还是给了重要的提示：Read the output of installer to check which file were modified.&lt;/p&gt;

&lt;p&gt;那就按照指示看看第一步的自以为&lt;strong&gt;无用&lt;/strong&gt;的输出，其中比较关键的下面三点：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Installing RVM to /home/reyesyang/.rvm/
Adding rvm PATH line to /home/reyesyang/.bashrc /home/reyesyang/.zshrc.
Adding rvm loading line to /home/reyesyang/.bash_login /home/reyesyang/.zlogin.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In case of any issues read output of 'rvm requirements' and/or 'rvm notes'  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Installation of RVM in /home/reyesyang/.rvm/ is almost complete:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;To start using RVM you need to run &lt;code&gt;source /home/reyesyang/.rvm/scripts/rvm&lt;/code&gt;
in all your open shell windows, in rare cases you need to reopen all shell windows.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;行面可以看出，RVM 在安装是给~/.bashrc(~/.zshrc) 和~/.bash_login(~/.zlogin) 中分别添加了 RVM PATH：&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$PATH&lt;/span&gt;:&lt;span class="nv"&gt;$HOME&lt;/span&gt;/.rvm/bin &lt;span class="c"&gt;# Add RVM to PATH for scripting&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;和 RVM loading line：&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/.rvm/scripts/rvm"&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;source&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/.rvm/scripts/rvm"&lt;/span&gt; &lt;span class="c"&gt;# Load RVM into a shell session *as a function*&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ubutnu 的 Gnome Terminal 在启动时是 non-login shell，而 non-login shell 只会读取~/.bashrc 来进行初始化，所以没有读入写在~/.bash_login 中的 RVM loading line，以至于 RVM 没有作为 function 载入，故悲剧发生了。&lt;/p&gt;
&lt;h2 id="所以RVM官方给了我们两种解决办法："&gt;所以 RVM 官方给了我们两种解决办法：&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;就是设置 Gnome Terminal 默认以 login-shell 的方式启动，这样就会读取～/.bash_login 来初始化 shell，就解决问题了。&lt;/li&gt;
&lt;li&gt;如第一步安装完后输出中的提示：&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Installation of RVM in /home/reyesyang/.rvm/ is almost complete:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;To start using RVM you need to run &lt;code&gt;source /home/reyesyang/.rvm/scripts/rvm&lt;/code&gt;
in all your open shell windows, in rare cases you need to reopen all shell windows.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="但其实第一种方法有副作用"&gt;但其实第一种方法有副作用&lt;/h2&gt;
&lt;p&gt;就是 login shell 不会读取我们在~/.bashrc 中的配置，解决方法也不少：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;将 RVM loading line 从~/.bash_login 中移到~/.profile 中。但是 login shell 初始化时，如果~/.bash_login 存在，就不会读取~/.profile(可参考 [类 unix 系统如何初始化 shell][3])，所以要将~/.bash_login 文件删除。而～/.profile 文件中存在如下代码：
&lt;code&gt;bash
if [ -n "$BASH_VERSION" ]; then
# include .bashrc if it exists
if [ -f "$HOME/.bashrc" ]; then
. "$HOME/.bashrc"
fi
fi
&lt;/code&gt;
故该 login shell 也会自动载入~/.bashrc 中的配置。&lt;/li&gt;
&lt;li&gt;将～/.profile 文件中的代码拷贝到~/.bash_login 中&lt;/li&gt;
&lt;li&gt;直接将 RVM loading line 从~/.bash_login 中移到~/.bashrc 中，但不删除~/.bash_login，就需要确保 Gnome Terminal 以 non-login shell 的方式启动。&lt;/li&gt;
&lt;li&gt;直接将 RVM loading line 从~/.bash_login 中移到~/.bashrc 中，删除~/.bash_login，这时 Gnome Terminal 以 non-login shell 或 login-shell 的方式启动均可。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="参考"&gt;参考&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;[Installing RVM][1]&lt;/li&gt;
&lt;li&gt;[类 unix 系统如何初始化 shell][3]&lt;/li&gt;
&lt;li&gt;[What shell login means ('bash -l')][4]&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;[1]: &lt;a href="https://rvm.io/rvm/install/#explained" rel="nofollow" target="_blank"&gt;https://rvm.io/rvm/install/#explained&lt;/a&gt;
[2]: &lt;a href="https://rvm.io/integration/gnome-terminal/" rel="nofollow" target="_blank"&gt;https://rvm.io/integration/gnome-terminal/&lt;/a&gt;
[3]: &lt;a href="http://reyesyang.info/articles/26-how-to-initialize-a-new-shell-in-unix-like-os" rel="nofollow" target="_blank"&gt;http://reyesyang.info/articles/26-how-to-initialize-a-new-shell-in-unix-like-os&lt;/a&gt;
[4]: &lt;a href="https://rvm.io/support/faq/#shell_login" rel="nofollow" target="_blank"&gt;https://rvm.io/support/faq/#shell_login&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="原文链接"&gt;原文链接&lt;/h2&gt;
&lt;p&gt;&lt;a href="http://reyesyang.info/articles/27-install-rvm-step-by-step-and-why-rvm-is-not-a-function" rel="nofollow" target="_blank" title=""&gt;手把手安装 RVM 以及为什么 RVM is not a function&lt;/a&gt;  &lt;/p&gt;</description>
      <author>reyesyang</author>
      <pubDate>Thu, 07 Jun 2012 12:01:18 +0800</pubDate>
      <link>https://ruby-china.org/topics/3705</link>
      <guid>https://ruby-china.org/topics/3705</guid>
    </item>
    <item>
      <title>REE 即将完成自己的光荣使命</title>
      <description>&lt;p&gt;REE 对于 ruby1.8+ 内存机制的完善，给老 railser 们带来了极大的便利，很多线上网站现在也仍然跑在 REE 上。但随着 ruby core team 对 ruby 内存机制方面逐步的修善，REE 也将完成自己的使命。下面是 Phusion Team 最新的官方博客：
&lt;a href="http://blog.phusion.nl/2012/02/21/ruby-enterprise-edition-1-8-7-2012-02-released-end-of-life-imminent/" rel="nofollow" target="_blank"&gt;http://blog.phusion.nl/2012/02/21/ruby-enterprise-edition-1-8-7-2012-02-released-end-of-life-imminent/&lt;/a&gt;  &lt;/p&gt;</description>
      <author>reyesyang</author>
      <pubDate>Wed, 22 Feb 2012 10:45:19 +0800</pubDate>
      <link>https://ruby-china.org/topics/1359</link>
      <guid>https://ruby-china.org/topics/1359</guid>
    </item>
    <item>
      <title>代码托管服务 bitbucket</title>
      <description>&lt;p&gt;介绍里面写着：All plans include unlimited public &amp;amp; private repositories.
Free plan 的限制是 5 User.
他们对 User 的定义是：Someone with read or write access to one of your private repositories.&lt;/p&gt;

&lt;p&gt;所以用来托管个人项目还是很给力的，当然重要的一点：支持 Git. 
官方网站：&lt;a href="https://bitbucket.org" rel="nofollow" target="_blank"&gt;https://bitbucket.org&lt;/a&gt;  &lt;/p&gt;</description>
      <author>reyesyang</author>
      <pubDate>Fri, 10 Feb 2012 11:52:31 +0800</pubDate>
      <link>https://ruby-china.org/topics/1122</link>
      <guid>https://ruby-china.org/topics/1122</guid>
    </item>
    <item>
      <title>git - the simple guide</title>
      <description>&lt;p&gt;微博上面发现的一个 git 入门指南，分享上来：&lt;a href="http://rogerdudler.github.com/git-guide/" rel="nofollow" target="_blank"&gt;http://rogerdudler.github.com/git-guide/&lt;/a&gt;  &lt;/p&gt;</description>
      <author>reyesyang</author>
      <pubDate>Fri, 03 Feb 2012 11:14:18 +0800</pubDate>
      <link>https://ruby-china.org/topics/1026</link>
      <guid>https://ruby-china.org/topics/1026</guid>
    </item>
  </channel>
</rss>
