<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>LongLonghaoran</title>
    <link>https://ruby-china.org/LongLonghaoran</link>
    <description/>
    <language>en-us</language>
    <item>
      <title>初级架构师都干些什么？</title>
      <description>&lt;p&gt;听我女朋友说她们公司之前招聘了 2 个应届实习生，现在转正了，岗位定的是初级架构师，惊了，架构师还带初级这种说法的吗？而且还是应届生，上网搜索了一下，还真有很多初级架构师的招聘，真让我备受冲击啊。。&lt;/p&gt;</description>
      <author>LongLonghaoran</author>
      <pubDate>Mon, 19 Jul 2021 23:08:02 +0800</pubDate>
      <link>https://ruby-china.org/topics/41489</link>
      <guid>https://ruby-china.org/topics/41489</guid>
    </item>
    <item>
      <title>require、load 加载机制</title>
      <description>&lt;blockquote&gt;
&lt;p&gt;require 会按照$LOAD_PATH 中的路径来加载，但是 gems 路径并不在$LOAD_PATH 中，为什么也可以加载的到呢？&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="load方法:"&gt;load 方法：&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;load 方法用于根据相对路径、绝对路径、LOAD_PATH 来加载 ruby 文件，ruby 文件中的方法、类、常量都会导入，但是局部变量不会导入&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;特点：多次 load 同一个文件，会加载多次，也就是会多次执行被 load 的文件内的代码&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="$LOAD_PATH:"&gt;$LOAD_PATH:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;$LOAD_PATH 中存储了一组目录的绝对路径，对于 load 和 require 方法来说，如果方法参数只是一个不带路径的文件名的话，这时候就会去$LOAD_PATH 中定义的路径中去查找&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="默认的require:"&gt;默认的 require:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;与 load 最大的不同是不会加载同一个文件两次，多次 require 同一个文件只会加载一次，所有被加载过的文件，都会记录在一个全局变量$LOADED_FEATURES 中，不论是 load 还是 require，都无法在不加路径（相对路径，绝对路径）的情况下直接加载文件，因为当前路径不在$LOAD_PATH 中&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="rubygems中的require， gems是如何加载的呢?"&gt;rubygems 中的 require，gems 是如何加载的呢？&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;rubygems是安装ruby是会默认一同安装的库，并且在启动ruby时会默认加载，比如启动irb之后，通过查看$LOADED_FEATURES就会发现，已经有很多.rb文件被加载进来了,ruby默认的Kernel#require这个方法已经被rubygems重写了&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/LongLonghaoran/9b12c90e-c1cb-4217-a56a-44949fe23bab.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;打开该文件会发现，该文件正是重写了默认的Kernel#require方法:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/LongLonghaoran/425d9441-b358-4659-8d64-e5fec6f74252.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;这个重写的版本最大的特点，就是可以用来加载已经安装好的 gem，加载的流程大致是这样的：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;当 require(‘xx’) 的时候，先从$LOAD_PATH 中查找，是否能从$LOAD_PATH 中定义的路径中直接找到同名文件，如果找到的话，那么就按照默认情况直接加载&lt;/li&gt;
&lt;li&gt;如果没有找到，那么将会安装 gems 的目录查找，找到之后，activating(激活),将该 gem 所在目录 (比如 rails-6.0.3.6) 添加到$LOAD_PATH，这个 gem 中的 gemspec 还会声明该 gem 需要 require 的其他路径，按照惯例，一般都只会添加 lib 这个目录&lt;/li&gt;
&lt;li&gt;在$LOAD_PATH 被添加好之后，再次执行来查找 xx 这个文件，这次由于 gem 所在目录的 lib 也被添加到$LOAD_PATH，所以这次能够加载到了&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;一般来说 xx.rb，这个与 gem 包同名的 rb 文件中还会继续 require 该 gem 所需依赖的其他文件，随便查看一个 gem 看下，比如 tzinfo 这个 gem:&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/LongLonghaoran/070e35b1-634f-43a0-9913-6ce77e2ab1a6.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;这些 require 的文件全部都在该 gem 的 lib 目录下，所以都能够正常加载，以这个 tzinfo 为例，再 require(‘tzinfo’) 之后，$LOADED_FEATURES 自然就多了一大堆已加载的文件列表：&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/LongLonghaoran/f2e55c2d-3531-471e-ac80-993198e58395.png!large" title="" alt=""&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="Kernel#gem方法:"&gt;Kernel#gem方法:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;如果同时安装了一个 gem 的多个版本，比如 rails-6.0.3.7 和 rails-6.0.3.6，那么通过gem方法，可以将指定的gem的路径存入$LOAD_PATH，这样子之后在require该gem的时候，也就能按照指定的版本来加载了，上面的Kernel#require方法实际也是使用了gem方法，来将gem的路径放入$LOAD_PATH&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="rails中加载gems:"&gt;rails 中加载 gems:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;在 rails 的初始化加载/启动加载文件中 (比如 config/boot.rb)，会加载 bundler，我这里看到的是加载了 bundler/setup 这个文件，bundler/setup 的目的就是用来加载 Gemfile 中列出的 gem，执行流程大致是：

&lt;ul&gt;
&lt;li&gt;1.读取 Gemfile.lock 文件，根据 Gemfile.lock 文件中 spec 下的描述，获取该项目所需加载的 gem 的名称以及版本号&lt;/li&gt;
&lt;li&gt;2.调用 gem 方法，来激活该 gem，也就是将 gem 的相关路径加入到$LOAD_PATH&lt;/li&gt;
&lt;li&gt;3.最后在 application.rb 中，调用 Bundler.require，这个时候由于$LOAD_PATH 中已经存入了定义好的目录，所以 require 可以顺利的加载&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <author>LongLonghaoran</author>
      <pubDate>Tue, 01 Jun 2021 15:53:53 +0800</pubDate>
      <link>https://ruby-china.org/topics/41321</link>
      <guid>https://ruby-china.org/topics/41321</guid>
    </item>
    <item>
      <title>有人了解 theforeman 这个项目吗？</title>
      <description>&lt;h2 id="不卖关子，我是来寻求帮助的:joy:"&gt;不卖关子，我是来寻求帮助的&lt;img title=":joy:" alt="😂" src="https://twemoji.ruby-china.com/2/svg/1f602.svg" class="twemoji"&gt;
&lt;/h2&gt;&lt;h2 id="官方链接"&gt;官方链接&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://theforeman.org/" rel="nofollow" target="_blank" title=""&gt;theforeman&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="以我这段时间的理解，非常简要的介绍一下"&gt;以我这段时间的理解，非常简要的介绍一下&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;这是一个用于管理软件生命周期、主机、SSL 证书、HTTP 代理等很多与进行主机配置有关的操作的工具，涉及到技术插件比较多&lt;/li&gt;
&lt;li&gt;这是它官方的架构图
&lt;img src="https://l.ruby-china.com/photo/LongLonghaoran/f6bfdeb2-7b0c-4ac0-9be7-5d3fc4ce2042.png!large" title="" alt=""&gt;
&lt;/li&gt;
&lt;li&gt;如图所示，该项目是以 foreman(一个用 rails 框架开发的 web 项目) 为中心的系统管理平台，利用它进一步管理其余多台主机&lt;/li&gt;
&lt;li&gt;除了这个 web 项目以外，其余的的涉及到外部主机管理的功能主要通过插件 plugin 的来提供，大致会用到的技术有：&lt;/li&gt;
&lt;li&gt;libvirt 远程虚拟机管理&lt;/li&gt;
&lt;li&gt;smart-proxy 智能代理，借助智能代理，统一管理外部主机配置（具体怎么用我现在也不是很清楚）&lt;/li&gt;
&lt;li&gt;katello，内容管理，这个内容指的是软件包，比如用 katello 来管理使用 yum、apt 时下载软件包时，需要使用到的源，或者利用 katello 也可以自己搭建一个源&lt;/li&gt;
&lt;li&gt;candlepin，这个好像是和 katello 集成在一起的，用于处理发布订阅，主机订阅之后，可以定期将我们搭建好的源中的内容推送给主机，使用 java+tomcat&lt;/li&gt;
&lt;li&gt;pulp，这个好像也是和 katello 集成的，用于构建软件源仓库的，使用 python 编写&lt;/li&gt;
&lt;li&gt;puppet，用于自动化安装、配置主机，内部使用 jruby 编写&lt;/li&gt;
&lt;li&gt;....etc&lt;/li&gt;
&lt;li&gt;接下来是 foreman 这个 web 项目本身，其用到的 gem、技术也和我之前写的 ruby on rails 截然不同&lt;/li&gt;
&lt;li&gt;gettext 对应 i18n&lt;/li&gt;
&lt;li&gt;rabl 对应 jbuilder&lt;/li&gt;
&lt;li&gt;angular+react+webpacker-rails 对应 asset-pipeline(前端这块我挺傻眼的，代码规模有点大)&lt;/li&gt;
&lt;li&gt;dynflow 对应 workflow&lt;/li&gt;
&lt;li&gt;sidekiq 对应 foreman-task(其实仍然是用的 sidekiq，但是它封装了一层)&lt;/li&gt;
&lt;li&gt;...etc&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="其实我被这个项目弄的很头疼"&gt;其实我被这个项目弄的很头疼&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;这个项目其实用到的技术挺多的，如果只是考虑搭建起来自己使用的话，还是比较方便的，官方提供了 foreman-installer 以及很多安装文档，尤其是 foreman-installer，在 rhel 环境是可以一键安装并运行的&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;但是对于如何开发这个项目我就很头疼了 (公司已经在使用这个项目进行运维管理，会有少数开发需求，主要集中在 foreman 和 katello)，不知道有没有人进行这方面开发工作，这该如何上手，看着 foreman 明明是一个 rails 项目，现在却只能在生产模式下改代码然后给它重启，着实难受&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <author>LongLonghaoran</author>
      <pubDate>Tue, 18 May 2021 15:06:38 +0800</pubDate>
      <link>https://ruby-china.org/topics/41278</link>
      <guid>https://ruby-china.org/topics/41278</guid>
    </item>
    <item>
      <title>请教一个线程安全的问题</title>
      <description>&lt;h2 id="本意是想模拟一下线程不安全的情况"&gt;本意是想模拟一下线程不安全的情况&lt;/h2&gt;
&lt;p&gt;本意是想模拟一下线程不安全的情况，于是写了一下代码，创建 2 个线程共用 1 个变量，每个线程里面将共用变量 number 减 1&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;arr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;times&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;i&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
    &lt;span class="n"&gt;arr&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;Thread&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
        &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"t&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; 剩余&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;number&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;颗豆子&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
        &lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;number&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="k"&gt;do&lt;/span&gt;
            &lt;span class="nb"&gt;sleep&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="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"t&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; 剩余&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;number&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;颗豆子&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
            &lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
            &lt;span class="c1"&gt;# puts "t#{i} 减去1颗后，剩余#{number}颗豆子\n"&lt;/span&gt;
        &lt;span class="k"&gt;end&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;img src="https://l.ruby-china.com/photo/2020/de0d4d84-6cb7-4b72-bc87-3aa25e829d7a.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;但是一旦将 puts 语句放在 number -= 1 下方，就又不会出现这种问题了，这到底是为何&lt;img title=":confused:" alt="😕" src="https://twemoji.ruby-china.com/2/svg/1f615.svg" class="twemoji"&gt; &lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;arr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;times&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;i&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
    &lt;span class="n"&gt;arr&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;Thread&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
        &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"t&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; 剩余&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;number&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;颗豆子&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
        &lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;number&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="k"&gt;do&lt;/span&gt;
            &lt;span class="nb"&gt;sleep&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="c1"&gt;#puts "t#{i} 剩余#{number}颗豆子\n"&lt;/span&gt;
            &lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
            &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"t&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; 减去1颗后，剩余&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;number&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;颗豆子&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
        &lt;span class="k"&gt;end&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;img src="https://l.ruby-china.com/photo/2020/b3cb0781-9068-4b9b-8c1d-ee925f4696e3.png!large" title="" alt=""&gt;&lt;/p&gt;</description>
      <author>LongLonghaoran</author>
      <pubDate>Tue, 29 Dec 2020 16:20:22 +0800</pubDate>
      <link>https://ruby-china.org/topics/40760</link>
      <guid>https://ruby-china.org/topics/40760</guid>
    </item>
    <item>
      <title>RSpec + FactoryBot 出现奇怪的问题</title>
      <description>&lt;p&gt;application.rb:&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generators&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;g&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
  &lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test_framework&lt;/span&gt; &lt;span class="ss"&gt;:rspec&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                   &lt;span class="ss"&gt;fixtures: &lt;/span&gt;&lt;span class="kp"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                   &lt;span class="ss"&gt;view_specs: &lt;/span&gt;&lt;span class="kp"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                   &lt;span class="ss"&gt;helper_specs: &lt;/span&gt;&lt;span class="kp"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                   &lt;span class="ss"&gt;routing_specs: &lt;/span&gt;&lt;span class="kp"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                   &lt;span class="ss"&gt;controller_specs: &lt;/span&gt;&lt;span class="kp"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                   &lt;span class="ss"&gt;request_specs: &lt;/span&gt;&lt;span class="kp"&gt;false&lt;/span&gt;
  &lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;factory_bot&lt;/span&gt; &lt;span class="ss"&gt;dir: &lt;/span&gt;&lt;span class="s1"&gt;'spec/factories'&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Gemfile:&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;group :test, :development do
  gem "rspec-rails"
  gem 'factory_bot_rails'
end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这是 spec 下文件的样式:
&lt;img title="" alt="cb6568225b10a02718a645dff7631da2.png"&gt;&lt;/p&gt;

&lt;p&gt;spec/factories/users.rb&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;FactoryBot.define do
  100.times do |i|
    factory :user, class: "User" do
      login "test001"
      uid i
    end
  end
end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;spec_helper.rb&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# This file was generated by the `rails generate rspec:install` command. Conventionally, all&lt;/span&gt;
&lt;span class="c1"&gt;# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.&lt;/span&gt;
&lt;span class="c1"&gt;# The generated `.rspec` file contains `--require spec_helper` which will cause&lt;/span&gt;
&lt;span class="c1"&gt;# this file to always be loaded, without a need to explicitly require it in any&lt;/span&gt;
&lt;span class="c1"&gt;# files.&lt;/span&gt;
&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;span class="c1"&gt;# Given that it is always loaded, you are encouraged to keep this file as&lt;/span&gt;
&lt;span class="c1"&gt;# light-weight as possible. Requiring heavyweight dependencies from this file&lt;/span&gt;
&lt;span class="c1"&gt;# will add to the boot time of your test suite on EVERY test run, even for an&lt;/span&gt;
&lt;span class="c1"&gt;# individual file that may not need all of that loaded. Instead, consider making&lt;/span&gt;
&lt;span class="c1"&gt;# a separate helper file that requires the additional dependencies and performs&lt;/span&gt;
&lt;span class="c1"&gt;# the additional setup, and require it from the spec files that actually need&lt;/span&gt;
&lt;span class="c1"&gt;# it.&lt;/span&gt;
&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;span class="c1"&gt;# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration&lt;/span&gt;
&lt;span class="no"&gt;RSpec&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;configure&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;config&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
  &lt;span class="c1"&gt;# rspec-expectations config goes here. You can use an alternate&lt;/span&gt;
  &lt;span class="c1"&gt;# assertion/expectation library such as wrong or the stdlib/minitest&lt;/span&gt;
  &lt;span class="c1"&gt;# assertions if you prefer.&lt;/span&gt;
  &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expect_with&lt;/span&gt; &lt;span class="ss"&gt;:rspec&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;expectations&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
    &lt;span class="c1"&gt;# This option will default to `true` in RSpec 4. It makes the `description`&lt;/span&gt;
    &lt;span class="c1"&gt;# and `failure_message` of custom matchers include text for helper methods&lt;/span&gt;
    &lt;span class="c1"&gt;# defined using `chain`, e.g.:&lt;/span&gt;
    &lt;span class="c1"&gt;#     be_bigger_than(2).and_smaller_than(4).description&lt;/span&gt;
    &lt;span class="c1"&gt;#     # =&amp;gt; "be bigger than 2 and smaller than 4"&lt;/span&gt;
    &lt;span class="c1"&gt;# ...rather than:&lt;/span&gt;
    &lt;span class="c1"&gt;#     # =&amp;gt; "be bigger than 2"&lt;/span&gt;
    &lt;span class="n"&gt;expectations&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;include_chain_clauses_in_custom_matcher_descriptions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="c1"&gt;# rspec-mocks config goes here. You can use an alternate test double&lt;/span&gt;
  &lt;span class="c1"&gt;# library (such as bogus or mocha) by changing the `mock_with` option here.&lt;/span&gt;
  &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mock_with&lt;/span&gt; &lt;span class="ss"&gt;:rspec&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;mocks&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
    &lt;span class="c1"&gt;# Prevents you from mocking or stubbing a method that does not exist on&lt;/span&gt;
    &lt;span class="c1"&gt;# a real object. This is generally recommended, and will default to&lt;/span&gt;
    &lt;span class="c1"&gt;# `true` in RSpec 4.&lt;/span&gt;
    &lt;span class="n"&gt;mocks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;verify_partial_doubles&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="c1"&gt;# This option will default to `:apply_to_host_groups` in RSpec 4 (and will&lt;/span&gt;
  &lt;span class="c1"&gt;# have no way to turn it off -- the option exists only for backwards&lt;/span&gt;
  &lt;span class="c1"&gt;# compatibility in RSpec 3). It causes shared context metadata to be&lt;/span&gt;
  &lt;span class="c1"&gt;# inherited by the metadata hash of host groups and examples, rather than&lt;/span&gt;
  &lt;span class="c1"&gt;# triggering implicit auto-inclusion in groups with matching metadata.&lt;/span&gt;
  &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;shared_context_metadata_behavior&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="ss"&gt;:apply_to_host_groups&lt;/span&gt;

&lt;span class="c1"&gt;# The settings below are suggested to provide a good initial experience&lt;/span&gt;
&lt;span class="c1"&gt;# with RSpec, but feel free to customize to your heart's content.&lt;/span&gt;
&lt;span class="cm"&gt;=begin
  # This allows you to limit a spec run to individual examples or groups
  # you care about by tagging them with `:focus` metadata. When nothing
  # is tagged with `:focus`, all examples get run. RSpec also provides
  # aliases for `it`, `describe`, and `context` that include `:focus`
  # metadata: `fit`, `fdescribe` and `fcontext`, respectively.
  config.filter_run_when_matching :focus

  # Allows RSpec to persist some state between runs in order to support
  # the `--only-failures` and `--next-failure` CLI options. We recommend
  # you configure your source control system to ignore this file.
  config.example_status_persistence_file_path = "spec/examples.txt"

  # Limits the available syntax to the non-monkey patched syntax that is
  # recommended. For more details, see:
  #   - http://rspec.info/blog/2012/06/rspecs-new-expectation-syntax/
  #   - http://www.teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/
  #   - http://rspec.info/blog/2014/05/notable-changes-in-rspec-3/#zero-monkey-patching-mode
  config.disable_monkey_patching!

  # Many RSpec users commonly either run the entire suite or an individual
  # file, and it's useful to allow more verbose output when running an
  # individual spec file.
  if config.files_to_run.one?
    # Use the documentation formatter for detailed output,
    # unless a formatter has already been configured
    # (e.g. via a command-line flag).
    config.default_formatter = "doc"
  end

  # Print the 10 slowest examples and example groups at the
  # end of the spec run, to help surface which specs are running
  # particularly slow.
  config.profile_examples = 10

  # Run specs in random order to surface order dependencies. If you find an
  # order dependency and want to debug it, you can fix the order by providing
  # the seed, which is printed after each run.
  #     --seed 1234
  config.order = :random

  # Seed global randomization in this process using the `--seed` CLI option.
  # Setting this allows you to use `--seed` to deterministically reproduce
  # test failures related to randomization by passing the same `--seed` value
  # as the one that triggered the failure.
  Kernel.srand config.seed
=end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;rails_helper:&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# This file is copied to spec/ when you run 'rails generate rspec:install'&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'spec_helper'&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'support/factory'&lt;/span&gt;
&lt;span class="no"&gt;ENV&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'RAILS_ENV'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||=&lt;/span&gt; &lt;span class="s1"&gt;'test'&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="no"&gt;File&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expand_path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'../../config/environment'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kp"&gt;__FILE__&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# Prevent database truncation if the environment is production&lt;/span&gt;
&lt;span class="nb"&gt;abort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"The Rails environment is running in production mode!"&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;Rails&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;production?&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'rspec/rails'&lt;/span&gt;
&lt;span class="c1"&gt;# Add additional requires below this line. Rails is not loaded until this point!&lt;/span&gt;

&lt;span class="c1"&gt;# Requires supporting ruby files with custom matchers and macros, etc, in&lt;/span&gt;
&lt;span class="c1"&gt;# spec/support/ and its subdirectories. Files matching `spec/**/*_spec.rb` are&lt;/span&gt;
&lt;span class="c1"&gt;# run as spec files by default. This means that files in spec/support that end&lt;/span&gt;
&lt;span class="c1"&gt;# in _spec.rb will both be required and run as specs, causing the specs to be&lt;/span&gt;
&lt;span class="c1"&gt;# run twice. It is recommended that you do not name files matching this glob to&lt;/span&gt;
&lt;span class="c1"&gt;# end with _spec.rb. You can configure this pattern with the --pattern&lt;/span&gt;
&lt;span class="c1"&gt;# option on the command line or in ~/.rspec, .rspec or `.rspec-local`.&lt;/span&gt;
&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;span class="c1"&gt;# The following line is provided for convenience purposes. It has the downside&lt;/span&gt;
&lt;span class="c1"&gt;# of increasing the boot-up time by auto-requiring all files in the support&lt;/span&gt;
&lt;span class="c1"&gt;# directory. Alternatively, in the individual `*_spec.rb` files, manually&lt;/span&gt;
&lt;span class="c1"&gt;# require only the support files necessary.&lt;/span&gt;
&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;span class="c1"&gt;# Dir[Rails.root.join('spec', 'support', '**', '*.rb')].each { |f| require f }&lt;/span&gt;

&lt;span class="c1"&gt;# Checks for pending migrations and applies them before tests are run.&lt;/span&gt;
&lt;span class="c1"&gt;# If you are not using ActiveRecord, you can remove these lines.&lt;/span&gt;
&lt;span class="k"&gt;begin&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;Migration&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;maintain_test_schema!&lt;/span&gt;
&lt;span class="k"&gt;rescue&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;PendingMigrationError&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;
  &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;
  &lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="no"&gt;RSpec&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;configure&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;config&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
  &lt;span class="c1"&gt;# Remove this line if you're not using ActiveRecord or ActiveRecord fixtures&lt;/span&gt;
  &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fixture_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Rails&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;root&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/spec/fixtures"&lt;/span&gt;

  &lt;span class="c1"&gt;# If you're not using ActiveRecord, or you'd prefer not to run each of your&lt;/span&gt;
  &lt;span class="c1"&gt;# examples within a transaction, remove the following line or assign false&lt;/span&gt;
  &lt;span class="c1"&gt;# instead of true.&lt;/span&gt;
  &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use_transactional_fixtures&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt;

  &lt;span class="c1"&gt;# RSpec Rails can automatically mix in different behaviours to your tests&lt;/span&gt;
  &lt;span class="c1"&gt;# based on their file location, for example enabling you to call `get` and&lt;/span&gt;
  &lt;span class="c1"&gt;# `post` in specs under `spec/controllers`.&lt;/span&gt;
  &lt;span class="c1"&gt;#&lt;/span&gt;
  &lt;span class="c1"&gt;# You can disable this behaviour by removing the line below, and instead&lt;/span&gt;
  &lt;span class="c1"&gt;# explicitly tag your specs with their type, e.g.:&lt;/span&gt;
  &lt;span class="c1"&gt;#&lt;/span&gt;
  &lt;span class="c1"&gt;#     RSpec.describe UsersController, :type =&amp;gt; :controller do&lt;/span&gt;
  &lt;span class="c1"&gt;#       # ...&lt;/span&gt;
  &lt;span class="c1"&gt;#     end&lt;/span&gt;
  &lt;span class="c1"&gt;#&lt;/span&gt;
  &lt;span class="c1"&gt;# The different available types are documented in the features, such as in&lt;/span&gt;
  &lt;span class="c1"&gt;# https://relishapp.com/rspec/rspec-rails/docs&lt;/span&gt;
  &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;infer_spec_type_from_file_location!&lt;/span&gt;

  &lt;span class="c1"&gt;# Filter lines from Rails gems in backtraces.&lt;/span&gt;
  &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter_rails_from_backtrace!&lt;/span&gt;
  &lt;span class="c1"&gt;# arbitrary gems may also be filtered via:&lt;/span&gt;
  &lt;span class="c1"&gt;# config.filter_gems_from_backtrace("gem name")&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;一切看起来没什么问题啊，但是就是会一个奇怪的错误，在运行 rspec 命令之后：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;An error occurred while loading ./spec/models/apply_spec.rb.
Failure/Error: login 'test001'

NoMethodError:
  undefined method 'login' in 'user' factory
# /Users/a123/.rvm/gems/ruby-2.4.1@oa_saas/gems/factory_bot-5.0.2/lib/factory_bot/definition_proxy.rb:97:in `method_missing'
# ./spec/factories/users.rb:3:in `block (2 levels) in &amp;lt;top (required)&amp;gt;'
# /Users/a123/.rvm/gems/ruby-2.4.1@oa_saas/gems/factory_bot-5.0.2/lib/factory_bot/syntax/default.rb:18:in `instance_eval'
# /Users/a123/.rvm/gems/ruby-2.4.1@oa_saas/gems/factory_bot-5.0.2/lib/factory_bot/syntax/default.rb:18:in `factory'
# ./spec/factories/users.rb:2:in `block in &amp;lt;top (required)&amp;gt;'
# /Users/a123/.rvm/gems/ruby-2.4.1@oa_saas/gems/factory_bot-5.0.2/lib/factory_bot/syntax/default.rb:49:in `instance_eval'
# /Users/a123/.rvm/gems/ruby-2.4.1@oa_saas/gems/factory_bot-5.0.2/lib/factory_bot/syntax/default.rb:49:in `run'
# /Users/a123/.rvm/gems/ruby-2.4.1@oa_saas/gems/factory_bot-5.0.2/lib/factory_bot/syntax/default.rb:7:in `define'
# ./spec/factories/users.rb:1:in `&amp;lt;top (required)&amp;gt;'
# /Users/a123/.rvm/gems/ruby-2.4.1@oa_saas/gems/activesupport-5.1.7/lib/active_support/dependencies.rb:286:in `load'
# /Users/a123/.rvm/gems/ruby-2.4.1@oa_saas/gems/activesupport-5.1.7/lib/active_support/dependencies.rb:286:in `block in load'
# /Users/a123/.rvm/gems/ruby-2.4.1@oa_saas/gems/activesupport-5.1.7/lib/active_support/dependencies.rb:258:in `load_dependen
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;尝试很多办法去修改配置了还是不行，实在没办法了&lt;/p&gt;</description>
      <author>LongLonghaoran</author>
      <pubDate>Wed, 22 May 2019 22:57:10 +0800</pubDate>
      <link>https://ruby-china.org/topics/38564</link>
      <guid>https://ruby-china.org/topics/38564</guid>
    </item>
    <item>
      <title>如何从两个二维数组建立 range 对象并且进行遍历操作</title>
      <description>&lt;p&gt;问题是这样的，根据开始时间和结束时间，去遍历从开始到结束时间的年份和月份。&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;year1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;start_time1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;year&lt;/span&gt;
&lt;span class="n"&gt;month1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;start_time1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;month&lt;/span&gt;
&lt;span class="n"&gt;year2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;end_time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;year&lt;/span&gt;
&lt;span class="n"&gt;month2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;end_time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;month&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="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;year1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;month1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;year2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;month2&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nf"&gt;each&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;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="c1"&gt;### y和m分别从开始到结束时间的年和月&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;求帮助~，谢谢🙏&lt;/p&gt;</description>
      <author>LongLonghaoran</author>
      <pubDate>Fri, 14 Sep 2018 14:49:20 +0800</pubDate>
      <link>https://ruby-china.org/topics/37487</link>
      <guid>https://ruby-china.org/topics/37487</guid>
    </item>
    <item>
      <title>RubyMine、RubyMine 的终端、系统自带的终端中运行 gem install 以及 bundle install 的时候 gem 分别会安装到哪个位置去？</title>
      <description>&lt;p&gt;如题请问这三种情况下安装 gem 的位置有什么不同？
最近看了一个很老的项目，clone 下来准备本地跑一下的，结果 bundle 出错，关键有个时候不同环境下报错还不一致，尝试了好一会还是没什么办法，想请教下各位 !&lt;/p&gt;

&lt;p&gt;RubyMine 的 bundle install:
&lt;img src="https://l.ruby-china.com/photo/2018/97bd6b08-8ebf-4d69-b075-8fdeee872242.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;RubyMine 的终端的 bundle install
&lt;img src="https://l.ruby-china.com/photo/2018/407cdc31-85ca-4e48-8abe-bba24c702bda.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;系统自带的终端:
&lt;img src="https://l.ruby-china.com/photo/2018/17055707-8436-41e0-9ba2-0c0b776126e4.png!large" title="" alt=""&gt;&lt;/p&gt;</description>
      <author>LongLonghaoran</author>
      <pubDate>Mon, 16 Apr 2018 22:19:55 +0800</pubDate>
      <link>https://ruby-china.org/topics/35465</link>
      <guid>https://ruby-china.org/topics/35465</guid>
    </item>
  </channel>
</rss>
