<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>dawei (¶Lw)</title>
    <link>https://ruby-china.org/dawei</link>
    <description></description>
    <language>en-us</language>
    <item>
      <title>请求帮助 Ruby [hash] 与 Python [dict]</title>
      <description>&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="mf"&gt;2.5&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mo"&gt;007&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;hash&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;a: &lt;/span&gt;&lt;span class="s1"&gt;'1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;b: &lt;/span&gt;&lt;span class="s1"&gt;'2'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;c: &lt;/span&gt;&lt;span class="s1"&gt;'3'&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
 &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:a&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:b&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:c&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"3"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="mf"&gt;2.5&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mo"&gt;00&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_json&lt;/span&gt;
 &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"{&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;a&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;1&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;,&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;b&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;2&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;,&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;c&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;3&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;}"&lt;/span&gt;
&lt;span class="mf"&gt;2.5&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mo"&gt;00&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;length&lt;/span&gt;
 &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;

&lt;span class="mf"&gt;2.5&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mo"&gt;010&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dump&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
 &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"{&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;a&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;1&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;,&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;b&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;2&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;,&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;c&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;3&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;}"&lt;/span&gt;
&lt;span class="mf"&gt;2.5&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mo"&gt;011&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dump&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;length&lt;/span&gt;
 &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;a&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;b&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;2&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;c&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;3&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;a&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;, &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;b&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;, &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;c&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="mi"&gt;30&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;怎样用 ruby 得到和 python 同样得结果呢？&lt;/p&gt;

&lt;p&gt;已经尝试过：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="mf"&gt;2.5&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mo"&gt;015&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;space: &lt;/span&gt;&lt;span class="s2"&gt;" "&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
 &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"{&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;a&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;: &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;1&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;,&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;b&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;: &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;2&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;,&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;c&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;: &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;3&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;}"&lt;/span&gt;
&lt;span class="mf"&gt;2.5&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mo"&gt;016&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;space: &lt;/span&gt;&lt;span class="s2"&gt;" "&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;length&lt;/span&gt;
 &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;28&lt;/span&gt;
&lt;span class="c1"&gt;# space: a string that is put after, a : or , delimiter (default: '')&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ruby json string &lt;code&gt;:&lt;/code&gt; 或 &lt;code&gt;,&lt;/code&gt; 后无空格&lt;/p&gt;

&lt;p&gt;py   json string &lt;code&gt;:&lt;/code&gt; 或 &lt;code&gt;,&lt;/code&gt; 后存在空格 &lt;/p&gt;</description>
      <author>dawei</author>
      <pubDate>Mon, 15 Jun 2020 13:21:06 +0800</pubDate>
      <link>https://ruby-china.org/topics/39971</link>
      <guid>https://ruby-china.org/topics/39971</guid>
    </item>
    <item>
      <title>[求解] 奇怪的异常: find_or_create_by! </title>
      <description>&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# email.rb&lt;/span&gt;
&lt;span class="n"&gt;serialize&lt;/span&gt; &lt;span class="ss"&gt;:receive_permissions&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;Array&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;2.3.1 :042 &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; Email.find_or_create_by!&lt;span class="o"&gt;(&lt;/span&gt;code: &lt;span class="s2"&gt;"TestEmail02"&lt;/span&gt;, title: &lt;span class="s2"&gt;"TestEmail_02"&lt;/span&gt;, receive_permissions: &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"country"&lt;/span&gt;, &lt;span class="s2"&gt;"high_end"&lt;/span&gt;&lt;span class="o"&gt;])&lt;/span&gt;
  Email Load &lt;span class="o"&gt;(&lt;/span&gt;0.4ms&lt;span class="o"&gt;)&lt;/span&gt;  SELECT  &lt;span class="s2"&gt;"emails"&lt;/span&gt;.&lt;span class="k"&gt;*&lt;/span&gt; FROM &lt;span class="s2"&gt;"emails"&lt;/span&gt; WHERE &lt;span class="s2"&gt;"emails"&lt;/span&gt;.&lt;span class="s2"&gt;"code"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$1&lt;/span&gt; AND &lt;span class="s2"&gt;"emails"&lt;/span&gt;.&lt;span class="s2"&gt;"title"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$2&lt;/span&gt; AND &lt;span class="s2"&gt;"emails"&lt;/span&gt;.&lt;span class="s2"&gt;"receive_permissions"&lt;/span&gt; IN &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'country'&lt;/span&gt;, &lt;span class="s1"&gt;'high_end'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; LIMIT 1  &lt;span class="o"&gt;[[&lt;/span&gt;&lt;span class="s2"&gt;"code"&lt;/span&gt;, &lt;span class="s2"&gt;"TestEmail02"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;, &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"title"&lt;/span&gt;, &lt;span class="s2"&gt;"TestEmail_02"&lt;/span&gt;&lt;span class="o"&gt;]]&lt;/span&gt;
   &lt;span class="o"&gt;(&lt;/span&gt;0.2ms&lt;span class="o"&gt;)&lt;/span&gt;  BEGIN
  Email Exists &lt;span class="o"&gt;(&lt;/span&gt;0.4ms&lt;span class="o"&gt;)&lt;/span&gt;  SELECT  1 AS one FROM &lt;span class="s2"&gt;"emails"&lt;/span&gt; WHERE &lt;span class="s2"&gt;"emails"&lt;/span&gt;.&lt;span class="s2"&gt;"code"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'TestEmail02'&lt;/span&gt; LIMIT 1
  Email Exists &lt;span class="o"&gt;(&lt;/span&gt;0.3ms&lt;span class="o"&gt;)&lt;/span&gt;  SELECT  1 AS one FROM &lt;span class="s2"&gt;"emails"&lt;/span&gt; WHERE &lt;span class="s2"&gt;"emails"&lt;/span&gt;.&lt;span class="s2"&gt;"title"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'TestEmail_02'&lt;/span&gt; LIMIT 1
  SQL &lt;span class="o"&gt;(&lt;/span&gt;0.3ms&lt;span class="o"&gt;)&lt;/span&gt;  INSERT INTO &lt;span class="s2"&gt;"emails"&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"code"&lt;/span&gt;, &lt;span class="s2"&gt;"title"&lt;/span&gt;, &lt;span class="s2"&gt;"receive_permissions"&lt;/span&gt;, &lt;span class="s2"&gt;"created_at"&lt;/span&gt;, &lt;span class="s2"&gt;"updated_at"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; VALUES &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;, &lt;span class="nv"&gt;$2&lt;/span&gt;, &lt;span class="nv"&gt;$3&lt;/span&gt;, &lt;span class="nv"&gt;$4&lt;/span&gt;, &lt;span class="nv"&gt;$5&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
RETURNING &lt;span class="s2"&gt;"id"&lt;/span&gt;  &lt;span class="o"&gt;[[&lt;/span&gt;&lt;span class="s2"&gt;"code"&lt;/span&gt;, &lt;span class="s2"&gt;"TestEmail02"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;, &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"title"&lt;/span&gt;, &lt;span class="s2"&gt;"TestEmail_02"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;, &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"receive_permissions"&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;- country&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;- high_end&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;, &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"created_at"&lt;/span&gt;, &lt;span class="s2"&gt;"2019-10-10 17:59:54.716189"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;, &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"updated_at"&lt;/span&gt;, &lt;span class="s2"&gt;"2019-10-10 17:59:54.716189"&lt;/span&gt;&lt;span class="o"&gt;]]&lt;/span&gt;
   &lt;span class="o"&gt;(&lt;/span&gt;1.6ms&lt;span class="o"&gt;)&lt;/span&gt;  COMMIT
 &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="c"&gt;#&amp;lt;Email id: 29, code: "TestEmail02", title: "TestEmail_02", description: nil, receive_permissions: ["country", "high_end"], created_at: "2019-10-10 09:59:54", updated_at: "2019-10-10 09:59:54"&amp;gt;&lt;/span&gt;

2.3.1 :043 &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; Email.find_or_create_by!&lt;span class="o"&gt;(&lt;/span&gt;code: &lt;span class="s2"&gt;"TestEmail02"&lt;/span&gt;, title: &lt;span class="s2"&gt;"TestEmail_02"&lt;/span&gt;, receive_permissions: &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"country"&lt;/span&gt;, &lt;span class="s2"&gt;"high_end"&lt;/span&gt;&lt;span class="o"&gt;])&lt;/span&gt;
  Email Load &lt;span class="o"&gt;(&lt;/span&gt;0.4ms&lt;span class="o"&gt;)&lt;/span&gt;  SELECT  &lt;span class="s2"&gt;"emails"&lt;/span&gt;.&lt;span class="k"&gt;*&lt;/span&gt; FROM &lt;span class="s2"&gt;"emails"&lt;/span&gt; WHERE &lt;span class="s2"&gt;"emails"&lt;/span&gt;.&lt;span class="s2"&gt;"code"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$1&lt;/span&gt; AND &lt;span class="s2"&gt;"emails"&lt;/span&gt;.&lt;span class="s2"&gt;"title"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$2&lt;/span&gt; AND &lt;span class="s2"&gt;"emails"&lt;/span&gt;.&lt;span class="s2"&gt;"receive_permissions"&lt;/span&gt; IN &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'country'&lt;/span&gt;, &lt;span class="s1"&gt;'high_end'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; LIMIT 1  &lt;span class="o"&gt;[[&lt;/span&gt;&lt;span class="s2"&gt;"code"&lt;/span&gt;, &lt;span class="s2"&gt;"TestEmail02"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;, &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"title"&lt;/span&gt;, &lt;span class="s2"&gt;"TestEmail_02"&lt;/span&gt;&lt;span class="o"&gt;]]&lt;/span&gt;
   &lt;span class="o"&gt;(&lt;/span&gt;0.2ms&lt;span class="o"&gt;)&lt;/span&gt;  BEGIN
  Email Exists &lt;span class="o"&gt;(&lt;/span&gt;0.3ms&lt;span class="o"&gt;)&lt;/span&gt;  SELECT  1 AS one FROM &lt;span class="s2"&gt;"emails"&lt;/span&gt; WHERE &lt;span class="s2"&gt;"emails"&lt;/span&gt;.&lt;span class="s2"&gt;"code"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'TestEmail02'&lt;/span&gt; LIMIT 1
  Email Exists &lt;span class="o"&gt;(&lt;/span&gt;0.4ms&lt;span class="o"&gt;)&lt;/span&gt;  SELECT  1 AS one FROM &lt;span class="s2"&gt;"emails"&lt;/span&gt; WHERE &lt;span class="s2"&gt;"emails"&lt;/span&gt;.&lt;span class="s2"&gt;"title"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'TestEmail_02'&lt;/span&gt; LIMIT 1
   &lt;span class="o"&gt;(&lt;/span&gt;0.2ms&lt;span class="o"&gt;)&lt;/span&gt;  ROLLBACK
ActiveRecord::RecordInvalid: Validation failed: Code has already been taken, Title has already been taken
        from /Users/iewad/.rvm/gems/ruby-2.3.1/gems/activerecord-4.2.3/lib/active_record/validations.rb:79:in &lt;span class="sb"&gt;`&lt;/span&gt;raise_record_invalid&lt;span class="s1"&gt;'
        from /Users/iewad/.rvm/gems/ruby-2.3.1/gems/activerecord-4.2.3/lib/active_record/validations.rb:43:in `save!'&lt;/span&gt;
        from /Users/iewad/.rvm/gems/ruby-2.3.1/gems/activerecord-4.2.3/lib/active_record/attribute_methods/dirty.rb:29:in &lt;span class="sb"&gt;`&lt;/span&gt;save!&lt;span class="s1"&gt;'
        from /Users/iewad/.rvm/gems/ruby-2.3.1/gems/activerecord-4.2.3/lib/active_record/transactions.rb:291:in `block in save!'&lt;/span&gt;
        from /Users/iewad/.rvm/gems/ruby-2.3.1/gems/activerecord-4.2.3/lib/active_record/transactions.rb:351:in &lt;span class="sb"&gt;`&lt;/span&gt;block &lt;span class="k"&gt;in &lt;/span&gt;with_transaction_returning_status&lt;span class="s1"&gt;'
        from /Users/iewad/.rvm/gems/ruby-2.3.1/gems/activerecord-4.2.3/lib/active_record/connection_adapters/abstract/database_statements.rb:213:in `block in transaction'&lt;/span&gt;
        from /Users/iewad/.rvm/gems/ruby-2.3.1/gems/activerecord-4.2.3/lib/active_record/connection_adapters/abstract/transaction.rb:184:in &lt;span class="sb"&gt;`&lt;/span&gt;within_new_transaction&lt;span class="s1"&gt;'
        from /Users/iewad/.rvm/gems/ruby-2.3.1/gems/activerecord-4.2.3/lib/active_record/connection_adapters/abstract/database_statements.rb:213:in `transaction'&lt;/span&gt;
        from /Users/iewad/.rvm/gems/ruby-2.3.1/gems/activerecord-4.2.3/lib/active_record/transactions.rb:220:in &lt;span class="sb"&gt;`&lt;/span&gt;transaction&lt;span class="s1"&gt;'
        from /Users/iewad/.rvm/gems/ruby-2.3.1/gems/activerecord-4.2.3/lib/active_record/transactions.rb:348:in `with_transaction_returning_status'&lt;/span&gt;
        from /Users/iewad/.rvm/gems/ruby-2.3.1/gems/activerecord-4.2.3/lib/active_record/transactions.rb:291:in &lt;span class="sb"&gt;`&lt;/span&gt;save!&lt;span class="s1"&gt;'
        from /Users/iewad/.rvm/gems/ruby-2.3.1/gems/activerecord-4.2.3/lib/active_record/persistence.rb:51:in `create!'&lt;/span&gt;
        from /Users/iewad/.rvm/gems/ruby-2.3.1/gems/activerecord-4.2.3/lib/active_record/relation.rb:151:in &lt;span class="sb"&gt;`&lt;/span&gt;block &lt;span class="k"&gt;in &lt;/span&gt;create!&lt;span class="s1"&gt;'
        from /Users/iewad/.rvm/gems/ruby-2.3.1/gems/activerecord-4.2.3/lib/active_record/relation.rb:302:in `scoping'&lt;/span&gt;
        from /Users/iewad/.rvm/gems/ruby-2.3.1/gems/activerecord-4.2.3/lib/active_record/relation.rb:151:in &lt;span class="sb"&gt;`&lt;/span&gt;create!&lt;span class="s1"&gt;'
        from /Users/iewad/.rvm/gems/ruby-2.3.1/gems/activerecord-4.2.3/lib/active_record/relation.rb:219:in `find_or_create_by!'&lt;/span&gt;
        from /Users/iewad/.rvm/gems/ruby-2.3.1/gems/activerecord-4.2.3/lib/active_record/querying.rb:6:in &lt;span class="sb"&gt;`&lt;/span&gt;find_or_create_by!&lt;span class="s1"&gt;'
        from (irb):43
        from /Users/iewad/.rvm/gems/ruby-2.3.1/gems/railties-4.2.3/lib/rails/commands/console.rb:110:in `start'&lt;/span&gt;
        from /Users/iewad/.rvm/gems/ruby-2.3.1/gems/railties-4.2.3/lib/rails/commands/console.rb:9:in &lt;span class="sb"&gt;`&lt;/span&gt;start&lt;span class="s1"&gt;'
        from /Users/iewad/.rvm/gems/ruby-2.3.1/gems/railties-4.2.3/lib/rails/commands/commands_tasks.rb:68:in `console'&lt;/span&gt;
        from /Users/iewad/.rvm/gems/ruby-2.3.1/gems/railties-4.2.3/lib/rails/commands/commands_tasks.rb:39:in &lt;span class="sb"&gt;`&lt;/span&gt;run_command!&lt;span class="s1"&gt;'
        from /Users/iewad/.rvm/gems/ruby-2.3.1/gems/railties-4.2.3/lib/rails/commands.rb:17:in `&amp;lt;top (required)&amp;gt;'&lt;/span&gt;
        from bin/rails:4:in &lt;span class="sb"&gt;`&lt;/span&gt;require&lt;span class="s1"&gt;'
        from bin/rails:4:in `&amp;lt;main&amp;gt;'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>dawei</author>
      <pubDate>Thu, 10 Oct 2019 18:42:06 +0800</pubDate>
      <link>https://ruby-china.org/topics/39135</link>
      <guid>https://ruby-china.org/topics/39135</guid>
    </item>
    <item>
      <title>屏幕出问题了，不知道怎么搞成这样的，求最优维修方案。</title>
      <description>&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2019/a2efd674-9cd8-4301-a566-fd293e06fcd5.jpeg!large" title="" alt=""&gt;&lt;/p&gt;</description>
      <author>dawei</author>
      <pubDate>Sun, 09 Jun 2019 12:44:21 +0800</pubDate>
      <link>https://ruby-china.org/topics/38615</link>
      <guid>https://ruby-china.org/topics/38615</guid>
    </item>
    <item>
      <title>有什么好的建议 (SEO) 实现这种搜索结果？</title>
      <description>&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2018/7c2f055e-2dac-4248-8aec-56b7095b1346.png!large" title="" alt=""&gt;&lt;/p&gt;</description>
      <author>dawei</author>
      <pubDate>Tue, 20 Nov 2018 13:56:04 +0800</pubDate>
      <link>https://ruby-china.org/topics/37799</link>
      <guid>https://ruby-china.org/topics/37799</guid>
    </item>
    <item>
      <title>看到一篇关于 ruby-china 的文章！</title>
      <description>&lt;p&gt;&lt;a href="https://mp.weixin.qq.com/s/DaRseC0rknyFNkhryaNisg" rel="nofollow" target="_blank" title=""&gt;什么是纯粹的开源社区精神，我用了十年去探索&lt;/a&gt;&lt;/p&gt;</description>
      <author>dawei</author>
      <pubDate>Wed, 14 Nov 2018 10:04:21 +0800</pubDate>
      <link>https://ruby-china.org/topics/37757</link>
      <guid>https://ruby-china.org/topics/37757</guid>
    </item>
    <item>
      <title>ActiveAdmin 数据图表</title>
      <description>&lt;h3 id="Gemfile"&gt;Gemfile&lt;/h3&gt;
&lt;p&gt;Gemlist:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/ankane/groupdate" rel="nofollow" target="_blank" title=""&gt;groupdate&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/ankane/chartkick" rel="nofollow" target="_blank" title=""&gt;chartkick&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;#Gemfile&lt;/span&gt;
&lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s1"&gt;'groupdate'&lt;/span&gt;
&lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s2"&gt;"chartkick"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;执行&lt;code&gt;$ bundle install&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="ActiveAdmin 引入图表js库"&gt;ActiveAdmin 引入图表 js 库&lt;/h3&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;#config/initializers/active_admin.rb&lt;/span&gt;
&lt;span class="no"&gt;ActiveAdmin&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setup&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="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;register_javascript&lt;/span&gt; &lt;span class="s1"&gt;'https://www.gstatic.com/charts/loader.js'&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight coffeescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;# app/assets/javascripts/active_admin.js.coffee&lt;/span&gt;
&lt;span class="c1"&gt;#= require active_admin/base&lt;/span&gt;
&lt;span class="c1"&gt;#= require chartkick&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="ActiveAdmin 添加图表页面"&gt;ActiveAdmin 添加图表页面&lt;/h3&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;rails g active_admin:page StuUserChart
Running via Spring preloader &lt;span class="k"&gt;in &lt;/span&gt;process 87926
      create  app/admin/stu_user_chart.rb

&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#  app/admin/stu_user_chart.rb
ActiveAdmin.register_page "StuUserChart" do
  content do
    #para column_chart [["2016-01-01", 30], ["2016-02-01", 54]], stacked: true, library: {colors: ["#D80A5B", "#21C8A9", "#F39C12", "#A4C400"]}
    para line_chart StuUser.group_by_day(:created_at).count
  end
end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2018/83c02fc2-3daa-461f-8e25-ad288437fa15.jpg!large" title="" alt=""&gt;&lt;/p&gt;
&lt;h3 id="有帮助的链接"&gt;有帮助的链接&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://spin.atomicobject.com/2016/11/23/adding-google-charts-active-admin-application/" rel="nofollow" target="_blank" title=""&gt;Adding Google Charts to your Active Admin Application&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://juanda.me/create-custom-activeadmin-pages-with-charts" rel="nofollow" target="_blank" title=""&gt;Custom activeadmin pages with charts&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <author>dawei</author>
      <pubDate>Fri, 26 Oct 2018 11:19:19 +0800</pubDate>
      <link>https://ruby-china.org/topics/37680</link>
      <guid>https://ruby-china.org/topics/37680</guid>
    </item>
    <item>
      <title>推荐开源的 Ruby 学习书籍</title>
      <description>&lt;p&gt;9 本很优秀的推荐书籍，有针对包括初学者、中级程序员和高级程序员的书籍。当然，所有的书籍都是在开源许可下发布的。&lt;/p&gt;

&lt;p&gt;原文：&lt;a href="https://linux.cn/article-8821-1.html" rel="nofollow" target="_blank" title=""&gt;Linux 中国&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;仅仅做为分享，书籍质量自己把握！&lt;/strong&gt;&lt;/p&gt;</description>
      <author>dawei</author>
      <pubDate>Wed, 05 Sep 2018 10:41:55 +0800</pubDate>
      <link>https://ruby-china.org/topics/37441</link>
      <guid>https://ruby-china.org/topics/37441</guid>
    </item>
    <item>
      <title>Rails 中使用 Nokogiri 和 Watir 实现 Spider</title>
      <description>&lt;p&gt;最近我的 Rails App. 中，有场景需要抓取学校官网某栏目的新闻内容为小程序提供数据，故使用了&lt;code&gt;Nokogiri&lt;/code&gt;来实现，因该页面的分页是用 Js 来渲染的导致在 Nokogiri 查找分页节点的时候出现异常，后经搜索得知有&lt;code&gt;Watir&lt;/code&gt;这个 Gem。&lt;/p&gt;

&lt;p&gt;附分页渲染代码：&lt;/p&gt;
&lt;pre class="highlight erb"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;SCRIPT&amp;gt;&lt;/span&gt;
//createPageHTML(9, 0, "index", "html");
var currentPage = 0;//所在页从0开始
//var headPage = "index"+"."+"html";//首页
//var tailPage = "index_" + (countPage-1) + ".html"//尾页
var prevPage = currentPage-1;//上一页
var nextPage = currentPage+1;//下一页
var countPage = 17;//共多少页


//设置上一页代码
if(countPage&amp;gt;1&lt;span class="err"&gt;&amp;amp;&amp;amp;&lt;/span&gt;currentPage!=0&lt;span class="err"&gt;&amp;amp;&amp;amp;&lt;/span&gt;currentPage!=1)
document.write("&lt;span class="nt"&gt;&amp;lt;td&amp;gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;\"index.html\"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;首页&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;'prev'&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;\"index"+"_"&lt;/span&gt; &lt;span class="err"&gt;+&lt;/span&gt; &lt;span class="na"&gt;prevPage&lt;/span&gt; &lt;span class="err"&gt;+&lt;/span&gt; &lt;span class="err"&gt;"."+"&lt;/span&gt;&lt;span class="na"&gt;html&lt;/span&gt;&lt;span class="err"&gt;\"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;上一页&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&lt;/span&gt;");
else if(countPage&amp;gt;1&lt;span class="err"&gt;&amp;amp;&amp;amp;&lt;/span&gt;currentPage!=0&lt;span class="err"&gt;&amp;amp;&amp;amp;&lt;/span&gt;currentPage==1)
document.write("&lt;span class="nt"&gt;&amp;lt;td&amp;gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;\"index.html\"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;首页&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;'prev'&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;\"index.html\"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;上一页&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&lt;/span&gt;");
else
document.write("&lt;span class="nt"&gt;&amp;lt;td&amp;gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;'prev'&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;首页&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;'pre'&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;上一页&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&lt;/span&gt;");
//循环
var num = 8;
for(var i=0+(currentPage-1-(currentPage-1)%num) ; i&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;=(&lt;/span&gt;&lt;span class="na"&gt;num&lt;/span&gt;&lt;span class="err"&gt;+(&lt;/span&gt;&lt;span class="na"&gt;currentPage-1-&lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="na"&gt;currentPage-1&lt;/span&gt;&lt;span class="err"&gt;)%&lt;/span&gt;&lt;span class="na"&gt;num&lt;/span&gt;&lt;span class="err"&gt;))&amp;amp;&amp;amp;(&lt;/span&gt;&lt;span class="na"&gt;i&lt;/span&gt;&lt;span class="err"&gt;&amp;lt;&lt;/span&gt;&lt;span class="na"&gt;countPage&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt; &lt;span class="err"&gt;;&lt;/span&gt; &lt;span class="na"&gt;i&lt;/span&gt;&lt;span class="err"&gt;++){&lt;/span&gt;
&lt;span class="na"&gt;if(currentPage=&lt;/span&gt;&lt;span class="s"&gt;=i)&lt;/span&gt;
&lt;span class="na"&gt;document.write&lt;/span&gt;&lt;span class="err"&gt;("&amp;lt;&lt;/span&gt;&lt;span class="na"&gt;td&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;'curr'&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;"+(i+1)+"&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&lt;/span&gt;");
else if(i==0){
document.write("&lt;span class="nt"&gt;&amp;lt;td&amp;gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;'num'&lt;/span&gt;&lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;\"index"+"."+"html\"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;"+1+"&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&lt;/span&gt;");}
else
document.write("&lt;span class="nt"&gt;&amp;lt;td&amp;gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;'num'&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;\"index"+"_"&lt;/span&gt; &lt;span class="err"&gt;+&lt;/span&gt; &lt;span class="na"&gt;i&lt;/span&gt; &lt;span class="err"&gt;+&lt;/span&gt; &lt;span class="err"&gt;"."+"&lt;/span&gt;&lt;span class="na"&gt;html&lt;/span&gt;&lt;span class="err"&gt;\"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;"+(i+1)+"&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&lt;/span&gt;");
}
//设置下一页代码 
if(countPage&amp;gt;1&lt;span class="err"&gt;&amp;amp;&amp;amp;&lt;/span&gt;currentPage!=(countPage-1))
document.write("&lt;span class="nt"&gt;&amp;lt;td&amp;gt;&amp;lt;a&lt;/span&gt;  &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;'next'&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;\"index"+"_"&lt;/span&gt; &lt;span class="err"&gt;+&lt;/span&gt; &lt;span class="na"&gt;nextPage&lt;/span&gt; &lt;span class="err"&gt;+&lt;/span&gt; &lt;span class="err"&gt;"."+"&lt;/span&gt;&lt;span class="na"&gt;html&lt;/span&gt;&lt;span class="err"&gt;\"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;下一页&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;a&lt;/span&gt;  &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;'prev'&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;\"index_"&lt;/span&gt; &lt;span class="err"&gt;+&lt;/span&gt; &lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="na"&gt;countPage-1&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt; &lt;span class="err"&gt;+&lt;/span&gt; &lt;span class="err"&gt;".&lt;/span&gt;&lt;span class="na"&gt;html&lt;/span&gt;&lt;span class="err"&gt;\"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;末页&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&lt;/span&gt;");
else
document.write("&lt;span class="nt"&gt;&amp;lt;td&amp;gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;'next'&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;上一页&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;'prev'&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;末页&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&lt;/span&gt;");


function toPage(){
var _num = document.getElementById("num").value;
var str = "index"+"_"+(_num-1)+"."+"html";
var url = location.href.substring(0,location.href.lastIndexOf("/")+1);
if(_num&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;=1||&lt;/span&gt;&lt;span class="na"&gt;_num=&lt;/span&gt;&lt;span class="s"&gt;=null)&lt;/span&gt;
&lt;span class="na"&gt;location.href = &lt;/span&gt;&lt;span class="s"&gt;url+"index"+"."+"html";&lt;/span&gt;
&lt;span class="na"&gt;else&lt;/span&gt; &lt;span class="na"&gt;if&lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="na"&gt;_num&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;countPage)
alert("本频道最多"+countPage+"页");
else
location.href = url+str;
} 
&lt;span class="nt"&gt;&amp;lt;/SCRIPT&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="安装"&gt;安装&lt;/h2&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;#Gemfile&lt;/span&gt;
&lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s1"&gt;'watir'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'~&amp;gt; 6.12'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;bundle install&lt;/code&gt; 总是不难的&lt;/p&gt;

&lt;p&gt;接下来在 Spider Task 中使用&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;namespace&lt;/span&gt; &lt;span class="ss"&gt;:spiders&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'watir'&lt;/span&gt;

  &lt;span class="n"&gt;desc&lt;/span&gt; &lt;span class="s1"&gt;'Spider =&amp;gt; describe'&lt;/span&gt;
  &lt;span class="n"&gt;task&lt;/span&gt; &lt;span class="ss"&gt;get_xshd: :environment&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="vi"&gt;@start_url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"http://example.edu.cn"&lt;/span&gt;
    &lt;span class="n"&gt;get_lists&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vi"&gt;@start_url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'get_all'&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;def&lt;/span&gt; &lt;span class="nf"&gt;get_lists&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'update'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;browser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Watir&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Browser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt; &lt;span class="ss"&gt;:chrome&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;headless: &lt;/span&gt;&lt;span class="kp"&gt;true&lt;/span&gt;
    &lt;span class="n"&gt;browser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;goto&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;
    &lt;span class="c1"&gt;#browser = Watir::Browser.start url&lt;/span&gt;
    &lt;span class="n"&gt;doc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Nokogiri&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;HTML&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;browser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;html&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;browser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;close&lt;/span&gt;
    &lt;span class="err"&gt;·······&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可以看到，我开始是直接
&lt;code&gt;browser = Watir::Browser.start url&lt;/code&gt; 但是这样在我的服务器上出现了异常，经过折腾改变了写法，异常如下：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;Selenium&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;WebDriver&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Error&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;UnknownError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;unknown&lt;/span&gt; &lt;span class="ss"&gt;error: &lt;/span&gt;&lt;span class="no"&gt;Chrome&lt;/span&gt; &lt;span class="n"&gt;failed&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="ss"&gt;start: &lt;/span&gt;&lt;span class="n"&gt;exited&lt;/span&gt; &lt;span class="n"&gt;abnormally&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;unknown&lt;/span&gt; &lt;span class="ss"&gt;error: &lt;/span&gt;&lt;span class="no"&gt;DevToolsActivePort&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="n"&gt;doesn&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="n"&gt;exist&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;The&lt;/span&gt; &lt;span class="n"&gt;process&lt;/span&gt; &lt;span class="n"&gt;started&lt;/span&gt; &lt;span class="n"&gt;from&lt;/span&gt; &lt;span class="n"&gt;chrome&lt;/span&gt; &lt;span class="n"&gt;location&lt;/span&gt; &lt;span class="sr"&gt;/usr/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;google&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;chrome&lt;/span&gt; &lt;span class="n"&gt;is&lt;/span&gt; &lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;longer&lt;/span&gt; &lt;span class="n"&gt;running&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;so&lt;/span&gt; &lt;span class="no"&gt;ChromeDriver&lt;/span&gt; &lt;span class="n"&gt;is&lt;/span&gt; &lt;span class="n"&gt;assuming&lt;/span&gt; &lt;span class="n"&gt;that&lt;/span&gt; &lt;span class="no"&gt;Chrome&lt;/span&gt; &lt;span class="n"&gt;has&lt;/span&gt; &lt;span class="n"&gt;crashed&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;Driver&lt;/span&gt; &lt;span class="ss"&gt;info: &lt;/span&gt;&lt;span class="n"&gt;chromedriver&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;2.41&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;578700&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="n"&gt;f1ed5f9343c13f73144538f15c00b370eda6706&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="n"&gt;platform&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="no"&gt;Linux&lt;/span&gt; &lt;span class="mf"&gt;4.4&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;91&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;generic&lt;/span&gt; &lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我感觉是因为&lt;code&gt;new&lt;/code&gt; 和 &lt;code&gt;start&lt;/code&gt;的区别，我没有去验证这个区别。&lt;/p&gt;

&lt;p&gt;至此已经可以正常使用了。&lt;/p&gt;

&lt;hr&gt;
&lt;h2 id="一些需要注意的"&gt;一些需要注意的&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Watir&lt;/code&gt; 是会用到 browserdriver 的，所以务必安装好&lt;strong&gt;browserdriver&lt;/strong&gt;，我这里使用的是&lt;code&gt;chromedriver&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;服务器上安装 google-chrome&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;curl &lt;span class="nt"&gt;-sS&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add
&lt;span class="nb"&gt;sudo echo&lt;/span&gt; &lt;span class="s2"&gt;"deb [arch=amd64]  http://dl.google.com/linux/chrome/deb/ stable main"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; /etc/apt/sources.list.d/google-chrome.list
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nt"&gt;-y&lt;/span&gt; update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="nb"&gt;install &lt;/span&gt;google-chrome-stable
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;安装 chromedriver(这里要根据自己的环境做适当修改)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;wget https://chromedriver.storage.googleapis.com/2.41/chromedriver_linux64.zip
unzip chromedriver_linux64.zip
&lt;span class="nb"&gt;mv &lt;/span&gt;chromedriver /usr/bin/
&lt;span class="c"&gt;### 或者&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install &lt;/span&gt;chromium-chromedriver
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>dawei</author>
      <pubDate>Fri, 24 Aug 2018 10:11:36 +0800</pubDate>
      <link>https://ruby-china.org/topics/37380</link>
      <guid>https://ruby-china.org/topics/37380</guid>
    </item>
    <item>
      <title>在 MacOS High Sierra 安装 Ruby on Rails</title>
      <description>&lt;h2 id="在MacOS High Sierra 安装 Ruby on Rails"&gt;在 MacOS High Sierra 安装 Ruby on Rails&lt;/h2&gt;
&lt;p&gt;本篇文章将教您在 MacOs High Sierra 上安装 Ruby on Rails 的最新版本。会对安装故障进行描述和排查。这份安装指南可以用来被专业开发人员来参照配置他们的工作环境。初学者也可使用。&lt;/p&gt;

&lt;p&gt;附上原文链接：&lt;a href="http://railsapps.github.io/installrubyonrails-mac.html" rel="nofollow" target="_blank" title=""&gt;Install Ruby on Rails 5.2 · macOS High Sierra&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="摘要"&gt;摘要&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;更新你的系统至 MacOS High Sierra&lt;/li&gt;
&lt;li&gt;安装 &lt;code&gt;XCode Command Line Tools&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;安装配置 &lt;code&gt;Git&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;安装 &lt;code&gt;Homebrew&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;安装 &lt;code&gt;GPG&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;安装 &lt;code&gt;RVM&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;安装 &lt;code&gt;Ruby&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;更新 &lt;code&gt;RubyGems&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;安装 &lt;code&gt;Rails&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="更新 MacOS 至 10.13"&gt;更新 MacOS 至 10.13&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://www.apple.com/cn/macos/how-to-upgrade/" rel="nofollow" target="_blank" title=""&gt;怎样升级到 macOS High Sierra&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="终端程序"&gt;终端程序&lt;/h3&gt;
&lt;p&gt;你可以使用 Mac 自带的终端，当然我推荐你使用&lt;a href="https://www.iterm2.com/" rel="nofollow" target="_blank" title=""&gt;iterm2&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="检查是否安装了 XCode"&gt;检查是否安装了 &lt;code&gt;XCode&lt;/code&gt;
&lt;/h3&gt;
&lt;p&gt;检查你是否安装过 &lt;code&gt;XCode&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ xcode-select -p&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;如果出现：&lt;/p&gt;

&lt;p&gt;&lt;code&gt;xcode-select: error: unable to get active developer directory...&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;则是未安装。下一个节我们将一起安装 &lt;code&gt;XCode&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;如果出现：&lt;/p&gt;

&lt;p&gt;&lt;code&gt;/Applications/Xcode.app/Contents/Developer&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;或者&lt;/p&gt;

&lt;p&gt;&lt;code&gt;/Library/Developer/CommandLineTools&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;则证明你的电脑已经安装过 &lt;code&gt;XCode&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;XCode&lt;/code&gt; 更新请到 App Store&lt;/p&gt;

&lt;p&gt;&lt;em&gt;注意：如果你看到了这样的路径&lt;/em&gt;
&lt;code&gt;/Applications/Apple Dev Tools/Xcode.app/Contents/Developer&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;你必须删除&lt;code&gt;XCode&lt;/code&gt; 重新安装。如果这样 &lt;code&gt;RVM&lt;/code&gt; 将会安装失败。&lt;/p&gt;

&lt;p&gt;&lt;a href="http://rvm.io/support/faq#can-i-use-a-path-with-spaces" rel="nofollow" target="_blank" title=""&gt;RVM cannot accommodate spaces in a path&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="安装 XCode Command Line Tools"&gt;安装 &lt;code&gt;XCode Command Line Tools&lt;/code&gt;
&lt;/h3&gt;
&lt;p&gt;命令：&lt;code&gt;$ gcc&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;如果 XCode 未安装，你将看到如下图：&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2018/04bb251c-08e9-4f9f-8043-6c4225a29dc2.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;另外一种安装方法是：&lt;code&gt;$ xcode-select --install&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;你也会看到如上图，接下来点击“安装”就 OK（这将需要一些时间，依照您的网络环境而定）。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2018/6b9bce98-e0cd-4cef-809c-f76fab23d93c.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2018/6283328c-542e-4d34-9568-fa309831c89e.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;最后确定安装是否成功：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ xcode-select -p

/Library/Developer/CommandLineTools
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;确定 &lt;code&gt;gcc&lt;/code&gt; 是否成功安装：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ gcc --version
Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 7.0.0 (clang-700.1.76)
Target: x86_64-apple-darwin15.0.0
Thread model: posix
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="配置Git"&gt;配置 Git&lt;/h3&gt;
&lt;p&gt;关于 Git 的使用请参照 Git 官方文档 &lt;a href="https://git-scm.com/book/zh/v2" rel="nofollow" target="_blank" title=""&gt;Git-Book&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="安装Homebrew"&gt;安装 Homebrew&lt;/h3&gt;
&lt;p&gt;如果你的 Mac 未设置密码，那么你不能安装 homebrew
检查 Homebrew 是否安装：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ brew
-bash: brew: command not found
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;RVM 需要依赖&lt;a href="https://brew.sh/index_zh-cn" rel="nofollow" target="_blank" title=""&gt;Homebrew&lt;/a&gt;，Homebrew 是 MacOS 的包管理器。很多开发者利用它安装和管理各种各样的 Unix 软件包。
安装命令：&lt;/p&gt;

&lt;p&gt;&lt;code&gt;/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;安装脚本将会警告询问你的 Mac 密码：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;WARNING: Improper use of the sudo command could lead to data loss...
To proceed, enter your password...
Password:
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;输入密码的过程中你不会看到字符，输入完成之后尽管按下 Enter 键&lt;/p&gt;

&lt;p&gt;你可能注意到我们用到 ruby 来安装 Homebrew。我们使用 MacOS 内置的 Ruby 来安装 Homebrew，等下我们将使用 RVM 添加一个新的 Ruby 版本。&lt;/p&gt;
&lt;h3 id="安装GPG"&gt;安装 GPG&lt;/h3&gt;
&lt;p&gt;你可以使用 Homebrew 安装&lt;a href="https://en.wikipedia.org/wiki/GNU_Privacy_Guard" rel="nofollow" target="_blank" title=""&gt;gpg&lt;/a&gt;, 这是一个加密程序用来检查 RVM 下载的安全性。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;brew install gpg&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;当 GPG 安装完成之后，我们将安装 RVM 的安全秘钥：&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ command curl -sSL https://rvm.io/mpapis.asc | gpg --import -&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;如果你跳过这个步骤后续可能导致不能安装 RVM&lt;/p&gt;
&lt;h3 id="安装RVM"&gt;安装 RVM&lt;/h3&gt;
&lt;p&gt;RVM，Ruby 版本管理器，可以用它来安装和管理 Ruby 和 Rails 版本。
如果你的 Mac 用户名包含了空格字符，你必须删除空格。
RVM 网站教你&lt;a href="https://rvm.io/rvm/install/" rel="nofollow" target="_blank" title=""&gt;怎样安装 RVM&lt;/a&gt;。
这是更简单的方式：&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ \curl -L https://get.rvm.io | bash -s stable&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;如果在安装过程中看到如下信息：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mkdir: /etc/openssl: Permission denied
mkdir -p "/etc/openssl" failed, retrying with sudo
your password required for 'mkdir -p /etc/openssl':
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;请输入你的 Mac 密码。
在安装过程中你可能需要安装 Jave SE 6&lt;/p&gt;
&lt;h4 id="如果你已经安装了RVM"&gt;如果你已经安装了 RVM&lt;/h4&gt;
&lt;p&gt;更新命令：&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ rvm get stable --autolibs=enable&lt;/code&gt;&lt;/p&gt;
&lt;h4 id="RVM故障处理"&gt;RVM 故障处理&lt;/h4&gt;
&lt;p&gt;你可以使用&lt;code&gt;rvm implode&lt;/code&gt;删除 RVM 痕迹 (当然你的.bash_profile 文件除外)
如果你遇到任何困难，你可以得到 RVM 团队的帮助：
[&lt;a href="http://webchat.freenode.net/?channels=rvmhttp://webchat.freenode.net/?channels=rvm" rel="nofollow" target="_blank"&gt;http://webchat.freenode.net/?channels=rvmhttp://webchat.freenode.net/?channels=rvm&lt;/a&gt;](&lt;/p&gt;
&lt;h3 id="关闭重启终端"&gt;关闭重启终端&lt;/h3&gt;
&lt;p&gt;安装 RVM 之后，你必须关闭重启终端。
或者使用这个命令：&lt;code&gt;$ source ~/.rvm/scripts/rvm&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="安装Ruby"&gt;安装 Ruby&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;$ rvm install ruby-2.5.0&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;检查最新安装的 Ruby 版本：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ ruby -v
ruby 2.5.0...
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="检查Gem管理器"&gt;检查 Gem 管理器&lt;/h3&gt;
&lt;p&gt;RubyGems 是 Ruby 的包管理器。我们用它来安装软件包为 Ruby 添加功能。
检查 gem 管理器的版本。你可以看到：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ gem -v
2.6.14
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;当然你的计算机上可能是其它版本。&lt;/p&gt;

&lt;p&gt;更新 Ruby gem 管理器&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ gem update --system&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="RVM的全局设置"&gt;RVM 的全局设置&lt;/h3&gt;
&lt;p&gt;查看哪些 gem 是全局安装的&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ rvm gemset use global
$ gem list
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;一个无故障的开发环境需要最新版本的默认 gem
几个与 Ruby 或 RVM 默认安装的 Gem:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://rubygems.org/gems/bundler-unload" rel="nofollow" target="_blank" title=""&gt;bundler-unload&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://rubygems.org/gems/rake" rel="nofollow" target="_blank" title=""&gt;rake&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://rubygems.org/gems/rubygems-bundler" rel="nofollow" target="_blank" title=""&gt;rubygems-bundler&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://rubygems.org/gems/rvm" rel="nofollow" target="_blank" title=""&gt;rvm&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;获取还有一些其它的。&lt;/p&gt;

&lt;p&gt;查看旧的 gem 列表：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ gem outdated
### list not shown for brevity
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;更新旧的 gem:&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ gem update
### list not shown for brevity
&lt;/code&gt;&lt;/pre&gt;&lt;h4 id="更快的安装Gem"&gt;更快的安装 Gem&lt;/h4&gt;
&lt;p&gt;默认情况下，在 gem 安装时，文档也会同时安装。开发者很少会用到这些文档（通常会在网页进行查找）。
通过如下命令设置跳过文档安装步骤：&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ echo "gem: --no-document" &amp;gt;&amp;gt; ~/.gemrc&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;添加&lt;code&gt;gem: --no-document&lt;/code&gt; 至&lt;strong&gt;.gemrc&lt;/strong&gt;&lt;/p&gt;
&lt;h4 id="安装 Bundler"&gt;安装 Bundler&lt;/h4&gt;
&lt;p&gt;&lt;a href="https://rubygems.org/gems/bundler" rel="nofollow" target="_blank" title=""&gt;Bundler&lt;/a&gt; 是一个必需的 gem 包，它用来管理 gems 在开发和运行 Rails 应用，RVM 原来会自动安装 Bundler。在 1.26.11 版本之后，RVM 不再自动安装 Bundler。所以你必须安装它：&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ gem install bundler&lt;/code&gt;&lt;/p&gt;
&lt;h4 id="安装Nokogiri"&gt;安装 Nokogiri&lt;/h4&gt;
&lt;p&gt;Nokogiri 也是一个很重要的 Gem 包，请安装它：&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ gem install nokogiri&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="安装Rails"&gt;安装 Rails&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;$ gem install rails&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;如果你想安装 Rails 3.2.18:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ gem install rails --version=3.2.18&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;确认当前版本：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ rails -v
Rails 5.2.0
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="创建一个工作文件夹"&gt;创建一个工作文件夹&lt;/h3&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ mkdir workspace
$ cd workspace

&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="创建一个新的Rails Application"&gt;创建一个新的 Rails Application&lt;/h3&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ mkdir myapp
$ cd myapp
$ rvm use ruby-2.5.0@myapp --ruby-version --create
$ gem install rails
$ rails new .
&lt;/code&gt;&lt;/pre&gt;&lt;h4 id="快速测试"&gt;快速测试&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;$ rails -T&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;通过 Rails Server 命令运行 Rails Application:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ rails server&lt;/code&gt;&lt;/p&gt;
&lt;h4 id="为已有的Application指定一个Gemset"&gt;为已有的 Application 指定一个 Gemset&lt;/h4&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ echo "ruby-2.2.0" &amp;gt; .ruby-version
$ echo "myapp" &amp;gt; .ruby-gemset
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="Rails 数据库"&gt;Rails 数据库&lt;/h3&gt;
&lt;p&gt;Rails 默认使用 SQLite.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;rails new myapp --database=&lt;/code&gt; 这个命令将会显示所有支持的数据库&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Supported for preconfiguration are: mysql, oracle, postgresql, sqlite3, frontbase, ibm_db, 

sqlserver, jdbcmysql, jdbcsqlite3, jdbcpostgresql, jdbc.
&lt;/code&gt;&lt;/pre&gt;&lt;h4 id="PostgreSQL"&gt;PostgreSQL&lt;/h4&gt;
&lt;p&gt;MacOS 最简单的安装方法是通过 &lt;a href="http://postgresapp.com/" rel="nofollow" target="_blank" title=""&gt;Postgres.all&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;创建一个使用&lt;a href="http://www.postgresql.org/" rel="nofollow" target="_blank" title=""&gt;PostgrSQL&lt;/a&gt;的新应用：&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ rails new myapp --database=postgresql&lt;/code&gt;&lt;/p&gt;</description>
      <author>dawei</author>
      <pubDate>Fri, 20 Apr 2018 19:59:25 +0800</pubDate>
      <link>https://ruby-china.org/topics/35500</link>
      <guid>https://ruby-china.org/topics/35500</guid>
    </item>
  </channel>
</rss>
