<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>samport (阿福)</title>
    <link>https://ruby-china.org/samport</link>
    <description></description>
    <language>en-us</language>
    <item>
      <title>rails 6 中 Session 的存值和取值</title>
      <description>&lt;p&gt;最近将一个 rails5 的项目升级到 rails6，碰到一个登录不了的问题，排查后发现保存不了数据到 session 里，导致登录状态无法保存。请求指导，感谢！&lt;/p&gt;

&lt;p&gt;部分代码如下：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# 用户名及密码验证成功后，将admin id写入到session&lt;/span&gt;
 &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;sign_in&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;admin&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
   &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:admin_id&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;admin&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;id&lt;/span&gt;  &lt;span class="c1"&gt;# 这里向session中写入数据&lt;/span&gt;
   &lt;span class="n"&gt;admin&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;last_login_ip: &lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;remote_ip&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;last_login_at: &lt;/span&gt;&lt;span class="no"&gt;Time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
   &lt;span class="c1"&gt;# 。。。&lt;/span&gt;
 &lt;span class="k"&gt;end&lt;/span&gt;


&lt;span class="c1"&gt;# 获取当前用户&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;current_admin&lt;/span&gt;
   &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;admin_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:admin_id&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;   &lt;span class="c1"&gt;# 这里读取session中的数据。rails 6时取出来为空，rails 5没有这个问题&lt;/span&gt;
       &lt;span class="c1"&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="c1"&gt;# session_store.rb里面的配置&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;application&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;session_store&lt;/span&gt; &lt;span class="ss"&gt;:cookie_store&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;key: &lt;/span&gt;&lt;span class="s1"&gt;'_mytest_session'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;expire_after: &lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;days&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>samport</author>
      <pubDate>Wed, 06 Nov 2019 11:01:49 +0800</pubDate>
      <link>https://ruby-china.org/topics/39217</link>
      <guid>https://ruby-china.org/topics/39217</guid>
    </item>
    <item>
      <title>个人在线收款接口 (支付宝及微信)</title>
      <description>&lt;p&gt;支付宝几年前就关闭了个人收款接口，而微信从来就没有考虑过开放个人支付接口。目前个人如果要实现人民币在线收款，一个可行的方案是利用一些第三方的小平台提供的接口。这些平台的实现原理基本都是在平台上创建指定金额的账单，然后靠在 Android 手机安装的一个常驻 app，监听相同金额的支付消息来触发订单的支付请求。&lt;/p&gt;

&lt;p&gt;网上简单搜索了一下，就知道做这个生意的人真是不少。很多界面和文档几乎完全一样，也不知道是谁抄袭了谁的。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.paysapi.com/" rel="nofollow" target="_blank" title=""&gt;Paysapi&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.paypayzhu.com" rel="nofollow" target="_blank" title=""&gt;PayPay 猪&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bufpay.com/" rel="nofollow" target="_blank" title=""&gt;BufPay&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.weimifu.net" rel="nofollow" target="_blank" title=""&gt;微米富&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.xddpay.com/" rel="nofollow" target="_blank" title=""&gt;小叮当支付&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.xunhupay.com/" rel="nofollow" target="_blank" title=""&gt;虎皮椒&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.greenyep.com/" rel="nofollow" target="_blank" title=""&gt;绿点支付&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://paysdog.net/" rel="nofollow" target="_blank" title=""&gt;支付汪&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://ref66.com" rel="nofollow" target="_blank" title=""&gt;随 E 付&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.pay10086.com/" rel="nofollow" target="_blank" title=""&gt;Pay10086&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.839693.com/" rel="nofollow" target="_blank" title=""&gt;码支付&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;。。。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;在自己的 Rails 项目上试用过一两家的接口。感想是这种接口方式对于收款频率不高的个人开发者，还算比较靠谱。由于付款方是直接扫收款方的二维码，钱直接到收款方，不会经过这些平台上，所以没有资金风险。&lt;/p&gt;

&lt;p&gt;不过，如果选择的平台系统不稳定的话，会造成钱到帐了但不知道是属于哪个订单的尴尬情况。另外这些平台很多都是个人运营的，服务持续性也很难保证。所以选择一个靠谱的平台非常重要。&lt;/p&gt;

&lt;p&gt;还有一个思路就是完全自己开发一个类似的简易接口以及一个安卓通知监控 app，这样能避免一些不可控的因素。&lt;/p&gt;</description>
      <author>samport</author>
      <pubDate>Wed, 28 Nov 2018 16:40:21 +0800</pubDate>
      <link>https://ruby-china.org/topics/37828</link>
      <guid>https://ruby-china.org/topics/37828</guid>
    </item>
    <item>
      <title>数据库中小数的字段类型慎用 float</title>
      <description>&lt;p&gt;最近在项目中碰到一个奇怪的现象：商品表中明明有价格为 72.05 元的商品，用"价格等于 72.05"的条件却检索不出来。&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;Product&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;price: &lt;/span&gt;&lt;span class="mf"&gt;72.05&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;first&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="no"&gt;Product&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"price &amp;gt; ?"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;72&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"price &amp;lt; ?"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;73&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;开始以为是 ruby 程序的问题，后来直接在 mysql 命令行下用 sql 语句去检索，问题一样存在，看来是数据库本身的问题。&lt;/p&gt;

&lt;p&gt;反复检查以后，发现价格字段类型是 float 类型。使用 alter 的语句将价格字段修改成&lt;code&gt;decimal (总位数，小数点后位数)&lt;/code&gt;，问题得到了解决。&lt;/p&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- SQL 语句：&lt;/span&gt;
&lt;span class="k"&gt;ALTER&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;products&lt;/span&gt; &lt;span class="k"&gt;MODIFY&lt;/span&gt; &lt;span class="k"&gt;COLUMN&lt;/span&gt; &lt;span class="n"&gt;price&lt;/span&gt; &lt;span class="nb"&gt;decimal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&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;/code&gt;&lt;/pre&gt;
&lt;p&gt;当然，在 rails 项目里，按照流程还是必须创建和执行如下的 migration 的。不过不知道为什么这个操作并不能反映到 mysql 上，所以只能额外手工执行上面的 mysql 操作。&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ChangePirce&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;ActiveRecord&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Migration&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;5.2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;change&lt;/span&gt;
      &lt;span class="n"&gt;change_column&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;products&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:price&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:decimal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:precision&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:scale&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;2&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;关于 float 与 decimal 类型的区别，看起来不起眼，但是不注意的话会掉到这样的坑里去。这次的经验让我明白，以后跟金额相关的字段，统统明确用 decimal 类型。&lt;/p&gt;</description>
      <author>samport</author>
      <pubDate>Wed, 28 Nov 2018 11:06:23 +0800</pubDate>
      <link>https://ruby-china.org/topics/37826</link>
      <guid>https://ruby-china.org/topics/37826</guid>
    </item>
    <item>
      <title>如何编写 model 中的强制更新 method (感叹号方法)</title>
      <description>&lt;p&gt;想给 model 写一个带感叹号的方法，没找到一个标准的范例。请教各位 model 里面正确的感叹号方法的写法。&lt;/p&gt;

&lt;p&gt;目前我自己的写法如下：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class User &amp;lt; ActiveRecord::Base
  #...

  # 只改变属性
  def recharge(amount)
    self.balance += amount
  end

  # 改变属性，并立刻执行写数据库操作
  def recharge!(amount)
    self.recharge(amount)
    self.save!
  end

  #...
end
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>samport</author>
      <pubDate>Sun, 01 Jul 2018 14:45:06 +0800</pubDate>
      <link>https://ruby-china.org/topics/37074</link>
      <guid>https://ruby-china.org/topics/37074</guid>
    </item>
    <item>
      <title>非身份证认证的支付宝用户在国外不能用支付宝支付？</title>
      <description>&lt;p&gt;在中国生活的外国人或者港澳台地区的人，用护照 + 中国的银行卡也是能通过支付宝的个人认证的。在国内超市或淘宝上扫码购物、充值和提现都没问题。（余额宝之类的服务是不能用的）&lt;/p&gt;

&lt;p&gt;不过这些人到了境外，或在国外的电商上扫码付款时，会显示“&lt;strong&gt;抱歉，该服务仅支持中国大陆身份证实名用户。(ALI38718)&lt;/strong&gt;”。也就是说非大陆居民的外籍人士，在境外其实是没法给那些号称支持 AliPay 的国外商家付款的。&lt;/p&gt;

&lt;p&gt;谁能解释一下这是什么原因吗？&lt;/p&gt;</description>
      <author>samport</author>
      <pubDate>Tue, 05 Jun 2018 11:37:27 +0800</pubDate>
      <link>https://ruby-china.org/topics/36901</link>
      <guid>https://ruby-china.org/topics/36901</guid>
    </item>
    <item>
      <title>如何实现实时的并行处理</title>
      <description>&lt;p&gt;最近我正在写一个比特币的自动交易脚本。想实现并行 (或称为异步？后台任务？) 同时调用买和卖两个方法。目前使用的是&lt;code&gt;concurrent-ruby&lt;/code&gt;这个 gem。不知道什么原因有时候会造成多次重复执行，可能在某个地方有 retry 的机制吧。&lt;/p&gt;

&lt;p&gt;这种异步的实时并行处理，大家推荐用什么？sidekiq 的话，需要启动两个服务：redis+sidekiq，感觉有点笨重，不知道可靠性怎么样？&lt;/p&gt;

&lt;p&gt;示例代码：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class Trader
  # gem的官网：https://github.com/ruby-concurrency/concurrent-ruby
  include Concurrent::Async

  def initialize
    # init api client
  end

  def buy(price, size)
    # call buy api
  end

  def sell(price, size)
    # call sell api
  end
end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;调用样例：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;my_trader = Trader.new

# 普通调用方式
my_trader.buy(11, 0.1)
my_trader.sell(12, 0.1)

# 异步调用方式
my_trader.async.buy(11, 0.1)
my_trader.async.sell(12, 0.1)
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>samport</author>
      <pubDate>Tue, 24 Apr 2018 10:06:58 +0800</pubDate>
      <link>https://ruby-china.org/topics/35517</link>
      <guid>https://ruby-china.org/topics/35517</guid>
    </item>
    <item>
      <title>REST 接口使用 PUT，PATCH，DELETE 方法的意义是什么？</title>
      <description>&lt;p&gt;设计 REST API 接口，遵照规范的话应该使用 get、post、put、delete、patch 方法来进行服务器端的数据操作。由于 web 前端工程师多数都习惯于只使用 http 的 get 与 post 方法，所以也要求我这边只提供这两种方法的 api。&lt;/p&gt;

&lt;p&gt;其实我也一直没弄明白使用 put、delete、patch 这几种 HTTP 方法的好处到底在哪里。感觉除了装逼格，似乎实际意义不大。能否请高手简单的解释一下？&lt;/p&gt;</description>
      <author>samport</author>
      <pubDate>Thu, 19 Apr 2018 11:29:04 +0800</pubDate>
      <link>https://ruby-china.org/topics/35489</link>
      <guid>https://ruby-china.org/topics/35489</guid>
    </item>
    <item>
      <title>还有人看好比特币吗？</title>
      <description>&lt;p&gt;2017 年虚拟货币坐了一次过山车。今年各种负面消息不断，脸书和谷歌都相继发表声明禁止虚拟货币和 ICO 的广告。现在还有人在玩比特币吗？有没有人在做比特币相关的创业项目？&lt;/p&gt;

&lt;p&gt;这一波区块链概念的炒作算过去了？&lt;/p&gt;</description>
      <author>samport</author>
      <pubDate>Fri, 30 Mar 2018 12:58:38 +0800</pubDate>
      <link>https://ruby-china.org/topics/35365</link>
      <guid>https://ruby-china.org/topics/35365</guid>
    </item>
    <item>
      <title>该用 Bootstrap 4 还是 3?</title>
      <description>&lt;p&gt;Bootstrap4 现在也是正式版了，不知道对各种浏览器的兼容性有没有问题。新项目的话，该用版本 4 还是 3？大家一般都是用什么 gem 来集成到 rails 项目里？&lt;/p&gt;</description>
      <author>samport</author>
      <pubDate>Wed, 28 Mar 2018 14:58:24 +0800</pubDate>
      <link>https://ruby-china.org/topics/35346</link>
      <guid>https://ruby-china.org/topics/35346</guid>
    </item>
    <item>
      <title>有没有人在树莓派上玩 Ruby on Rails?</title>
      <description>&lt;p&gt;最近要在树莓派上开发一个简易的管理界面。主要功能是显示一些系统信息以及管理某个服务的账号。没有什么流量，只是管理员本人使用，sqlite 数据库就足够了。&lt;/p&gt;

&lt;p&gt;需求很简单，但是当我在树莓派 3 上安装 ruby 时，对 ruby 又失去了信心。不管是直接用代码编译安装，还是用 rbenv 安装，编译起来耗时都长达 40 多分钟。（已经去掉文档选项，编译参数改为&lt;code&gt;-j4&lt;/code&gt;用满 4 个 cpu 内核)&lt;/p&gt;

&lt;p&gt;现在已经开始编码了，不过也有些动摇是否应改用 python + flask 框架。另外也没想出来如何在 rails 网站里实现自动升级的功能（类似 wordrpess 网站里的升级链接）。&lt;/p&gt;

&lt;p&gt;如果有人在树莓派上玩过 ruby on rails，求指点。&lt;/p&gt;</description>
      <author>samport</author>
      <pubDate>Sat, 30 Dec 2017 09:20:16 +0800</pubDate>
      <link>https://ruby-china.org/topics/34797</link>
      <guid>https://ruby-china.org/topics/34797</guid>
    </item>
    <item>
      <title>rails-settings-cached 在 Rails 5 下没法用？</title>
      <description>&lt;p&gt;以前用过&lt;a href="https://github.com/huacnlee/rails-settings-cached" rel="nofollow" target="_blank" title=""&gt;rails-settings-cached&lt;/a&gt;这个神器去管理网站设置的参数，非常好用，也没碰到过问题。&lt;/p&gt;

&lt;p&gt;这次的新项目是基于 rails5.1，gem 安装以后，按照文档中的提示执行命令&lt;code&gt;rails g settings:install&lt;/code&gt;，提示以下错误信息：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[user1@mac1 demo1 (master)]$ rails g settings:install
[WARNING] Could not load generator "generators/settings/install_generator". Error: Settings is not a module.
/Users/user1/.rvm/gems/ruby-2.4.2/gems/rails-settings-cached-0.6.6/lib/generators/settings/install_generator.rb:4:in `&amp;lt;top (required)&amp;gt;'
/Users/user1/.rvm/gems/ruby-2.4.2/gems/activesupport-5.1.4/lib/active_support/dependencies.rb:292:in `require'
/Users/user1/.rvm/gems/ruby-2.4.2/gems/activesupport-5.1.4/lib/active_support/dependencies.rb:292:in `block in require'
/Users/user1/.rvm/gems/ruby-2.4.2/gems/activesupport-5.1.4/lib/active_support/dependencies.rb:258:in `load_dependency'
/Users/user1/.rvm/gems/ruby-2.4.2/gems/activesupport-5.1.4/lib/active_support/dependencies.rb:292:in `require'
/Users/user1/.rvm/gems/ruby-2.4.2/gems/railties-5.1.4/lib/rails/command/behavior.rb:82:in `block (2 levels) in lookup'
/Users/user1/.rvm/gems/ruby-2.4.2/gems/railties-5.1.4/lib/rails/command/behavior.rb:78:in `each'
/Users/user1/.rvm/gems/ruby-2.4.2/gems/railties-5.1.4/lib/rails/command/behavior.rb:78:in `block in lookup'
/Users/user1/.rvm/gems/ruby-2.4.2/gems/railties-5.1.4/lib/rails/command/behavior.rb:77:in `each'
/Users/user1/.rvm/gems/ruby-2.4.2/gems/railties-5.1.4/lib/rails/command/behavior.rb:77:in `lookup'
/Users/user1/.rvm/gems/ruby-2.4.2/gems/railties-5.1.4/lib/rails/generators.rb:250:in `find_by_namespace'
/Users/user1/.rvm/gems/ruby-2.4.2/gems/railties-5.1.4/lib/rails/generators.rb:267:in `invoke'
/Users/user1/.rvm/gems/ruby-2.4.2/gems/railties-5.1.4/lib/rails/commands/generate/generate_command.rb:24:in `perform'
/Users/user1/.rvm/gems/ruby-2.4.2/gems/thor-0.20.0/lib/thor/command.rb:27:in `run'
/Users/user1/.rvm/gems/ruby-2.4.2/gems/thor-0.20.0/lib/thor/invocation.rb:126:in `invoke_command'
/Users/user1/.rvm/gems/ruby-2.4.2/gems/thor-0.20.0/lib/thor.rb:387:in `dispatch'
/Users/user1/.rvm/gems/ruby-2.4.2/gems/railties-5.1.4/lib/rails/command/base.rb:63:in `perform'
/Users/user1/.rvm/gems/ruby-2.4.2/gems/railties-5.1.4/lib/rails/command.rb:44:in `invoke'
/Users/user1/.rvm/gems/ruby-2.4.2/gems/railties-5.1.4/lib/rails/commands.rb:16:in `&amp;lt;top (required)&amp;gt;'
bin/rails:4:in `require'
bin/rails:4:in `&amp;lt;main&amp;gt;'
Could not find generator 'settings:install'. Maybe you meant 'config:install', 'test_unit:system' or 'scss:assets'
Run `rails generate --help` for more options.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;搜索了网上，发现有人报告过同样的错误，后来华顺没有跟进了：&lt;a href="https://github.com/huacnlee/rails-settings-cached/issues/54" rel="nofollow" target="_blank" title=""&gt;https://github.com/huacnlee/rails-settings-cached/issues/54&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;有人怀疑&lt;code&gt;settings&lt;/code&gt;在新版本的 rails 中是保留关键字了，所以需要将模块改名称。请指教如何解决这个问题。谢谢！！&lt;/p&gt;</description>
      <author>samport</author>
      <pubDate>Sat, 28 Oct 2017 19:54:55 +0800</pubDate>
      <link>https://ruby-china.org/topics/34451</link>
      <guid>https://ruby-china.org/topics/34451</guid>
    </item>
    <item>
      <title>CentOS 7 下 Nginx 安装使用 Let’ s Encrypt 证书的完整过程</title>
      <description>&lt;p&gt;最近在项目上线过程中顺便整理了几篇原创文章，还没发到自己的博客上，先在这里分享了。&lt;/p&gt;
&lt;h2 id="CentOS7下nginx安装使用Let’s Encrypt证书的完整过程"&gt;CentOS7 下 nginx 安装使用 Let’s Encrypt 证书的完整过程&lt;/h2&gt;
&lt;p&gt;网站转成 https 是大势所趋。但是在国内，推进的过程显然要比国外慢很多。&lt;/p&gt;

&lt;p&gt;现阶段如果将自己的网站改成 https 以后，会碰到这样的尴尬现象：如果在页面上引用了&lt;code&gt;http://&lt;/code&gt;的链接或者图片，用户在浏览器上会看到类似&lt;code&gt;该网站是非安全网站的警告&lt;/code&gt;，对于网站运营者来说可以说非常冤。由于很多链接是第三方的，没有办法去控制。&lt;/p&gt;

&lt;p&gt;对于 api 接口类的网站，就不存在混合的问题，所以首先应该从 api 后台接口部分开始用 https。(ios 已经强制要求接口地址必须为 https 了)&lt;/p&gt;

&lt;p&gt;大牌提供商的 SSL 证书可不便宜，对于大公司也许不算什么，但是对于小公司及个人来说贵了。现在国外出现的免费 SSL 服务商&lt;strong&gt;Let’s Encrypt&lt;/strong&gt;，绝对是小公司或者开发者的福音。&lt;em&gt;(现阶段在天朝也能够正常使用，但是未来不清楚。如果天朝有一天自绝于世界网络的话，没准这个证书也会被封堵。)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;这里整理了在 CentOS7 + nginx 安装和使用&lt;strong&gt;Let’s Encrypt&lt;/strong&gt;的完整过程。&lt;/p&gt;

&lt;p&gt;官方网站：&lt;a href="https://letsencrypt.org" rel="nofollow" target="_blank" title=""&gt;https://letsencrypt.org&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;申请 let's encript 证书可以有三种方式：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://certbot.eff.org/" rel="nofollow" target="_blank" title=""&gt;通过 certbot 脚本&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://community.letsencrypt.org/t/web-hosting-who-support-lets-encrypt/6920" rel="nofollow" target="_blank" title=""&gt;通过支持 Letencript 的虚拟主机提供商&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://certbot.eff.org/docs/using.html#manual" rel="nofollow" target="_blank" title=""&gt;手工申请 manual mode&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;没有特殊情况，首选采用 certbot 脚本方式。&lt;/p&gt;

&lt;p&gt;由于 letsencrypt 证书的有效期只有 90 天，需要长期使用的话，需要在失效前进行延长申请。用 certbot 脚本工具，可以将延期申请的脚本写到定时任务来自动完成，非常方便。&lt;/p&gt;
&lt;h2 id="一、前提条件"&gt;一、前提条件&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;拥有一个域名，例如 mydomain.com (在国内主机的用的话，还需要通过 ICP 备案)&lt;/li&gt;
&lt;li&gt;在域名服务器创建一条 A 记录，指向云主机的公网 IP 地址。例如 demo.mydomain.com 指向 xxx.xxx.xxx.xxx 的 IP 地址&lt;/li&gt;
&lt;li&gt;要等到新创建的域名解析能在公网上被解析到。&lt;/li&gt;
&lt;li&gt;据说国内的域名提供商对 letsencrypt 的支持非常差，但是经过试验，至少现阶段用 dnspod 解析的域名还没碰到问题。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="二、在云主机上安装nginx服务器，配置好最基本的80口ngnix站点"&gt;二、在云主机上安装 nginx 服务器，配置好最基本的 80 口 ngnix 站点&lt;/h2&gt;
&lt;p&gt;例如，假设为 demo.mydomain.com 快速配置一个最简单的 nginx 站点&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;安装 nginx 服务器&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yum &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; nginx
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;配置一个 nginx 站点&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; /opt/www/demo.mydomain.com &lt;span class="nt"&gt;-p&lt;/span&gt;
&lt;span class="nb"&gt;chown &lt;/span&gt;nginx:nginx /opt/www/demo.mydomain.com/ &lt;span class="nt"&gt;-R&lt;/span&gt;
vi /etc/nginx/conf.d/demo.mydomain.com.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;将以下内容复制到该文件中&lt;/p&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="k"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;server_name&lt;/span&gt; &lt;span class="s"&gt;demo.mydomain.com&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;charset&lt;/span&gt; &lt;span class="s"&gt;utf-8&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;root&lt;/span&gt; &lt;span class="n"&gt;/opt/www/demo.mydomain.com&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;index&lt;/span&gt; &lt;span class="s"&gt;index.html&lt;/span&gt; &lt;span class="s"&gt;index.htm&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;access_log&lt;/span&gt;  &lt;span class="n"&gt;/var/log/nginx/demo.mydomain.com_access.log&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;error_log&lt;/span&gt;  &lt;span class="n"&gt;/var/log/nginx/demo.mydomain.com_error.log&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;启动 nginx 服务&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;systemctl start nginx
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;注意：要确认 CentOS 服务器开放 80 口及 443 端口&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;在浏览器上确认访问到&lt;code&gt;http://demo.mydomain.com&lt;/code&gt; 
如果没有页面的话，正常情况下应该会显示 403 错误。nginx 站点配置完成。&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="三、安装certbot工具"&gt;三、安装 certbot 工具&lt;/h2&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;yum &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; epel-release
yum &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; certbot
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="四、使用certbot命令初次申请证书"&gt;四、使用 certbot 命令初次申请证书&lt;/h2&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# 使用方法：certbot certonly --webroot -w [Web站点目录] -d [站点域名] -m [联系人email地址] --agree-tos
# 例如：
certbot certonly --webroot -w /opt/www/demo.mydomain.com -d demo.mydomain.com -m myname@gmail.com --agree-tos
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;注意：联系人 email 地址要填写真实有效的，letsencrypt 会在证书在过期以前发送预告的通知邮件。
  申请成功后，会显示以下 Congratulations 信息&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/[xxx.xxx.xxx]/fullchain.pem. Your cert will
   expire on 2017-03-20. To obtain a new or tweaked version of this
   certificate in the future, simply run certbot again. To
   non-interactively renew *all* of your certificates, run "certbot
   renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;证书的保存位置在：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/etc/letsencrypt/live/demo.mydomain.com/
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="五、查看证书有效期的命令"&gt;五、查看证书有效期的命令&lt;/h2&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;openssl x509 &lt;span class="nt"&gt;-noout&lt;/span&gt; &lt;span class="nt"&gt;-dates&lt;/span&gt; &lt;span class="nt"&gt;-in&lt;/span&gt; /etc/letsencrypt/live/[demo.mydomain.com]/cert.pem
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;显示的是格林威治时间，不知道怎么才能显示当前时区。&lt;/p&gt;
&lt;h2 id="六、设置定时任务自动更新证书"&gt;六、设置定时任务自动更新证书&lt;/h2&gt;
&lt;p&gt;letsencrypt 证书的有效期是 90 天，但是可以用脚本去更新。&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 更新证书&lt;/span&gt;
certbot renew &lt;span class="nt"&gt;--dry-run&lt;/span&gt; 
&lt;span class="c"&gt;# 如果不需要返回的信息，可以用静默方式：&lt;/span&gt;
certbot renew &lt;span class="nt"&gt;--quiet&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;注意：更新证书时候网站必须是能访问到的&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# 可以使用crontab定时更新，例如：
# 每月1号5时执行执行一次更新，并重启nginx服务器
00 05 01 * * /usr/bin/certbot renew --quiet &amp;amp;&amp;amp; /bin/systemctl restart nginx
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="七、应用实例：配置nginx使用证书开通https站点"&gt;七、应用实例：配置 nginx 使用证书开通 https 站点&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;生成 Perfect Forward Security（PFS）键值&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; /etc/ssl/private/ &lt;span class="nt"&gt;-p&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; /etc/ssl/private/
openssl dhparam 2048 &lt;span class="nt"&gt;-out&lt;/span&gt; dhparam.pem
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Perfect Forward Security（PFS) 是个什么东西，中文翻译成&lt;code&gt;完美前向保密&lt;/code&gt;，一两句话也说不清楚，反正是这几年才提倡的加强安全性的技术。如果本地还没有生成这个键值，需要先执行生成的命令。&lt;/li&gt;
&lt;li&gt;生成的过程还挺花时间的，喝杯咖啡歇会儿吧。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;配置 nginx 站点，例如&lt;code&gt;/etc/nginx/conf.d/demo.mydomain.com.conf&lt;/code&gt;，样例内容如下：&lt;/p&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="k"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;server_name&lt;/span&gt; &lt;span class="s"&gt;demo.mydomain.com&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;rewrite&lt;/span&gt; &lt;span class="s"&gt;^&lt;/span&gt; &lt;span class="s"&gt;https://&lt;/span&gt;&lt;span class="nv"&gt;$server_name$request_uri&lt;/span&gt;&lt;span class="s"&gt;?&lt;/span&gt; &lt;span class="s"&gt;permanent&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;443&lt;/span&gt; &lt;span class="s"&gt;ssl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kn"&gt;server_name&lt;/span&gt; &lt;span class="s"&gt;demo.mydomain.com&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kn"&gt;charset&lt;/span&gt; &lt;span class="s"&gt;utf-8&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kn"&gt;root&lt;/span&gt; &lt;span class="n"&gt;/opt/www/demo.mydomain.com&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kn"&gt;index&lt;/span&gt; &lt;span class="s"&gt;index.html&lt;/span&gt; &lt;span class="s"&gt;index.htm&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kn"&gt;access_log&lt;/span&gt;  &lt;span class="n"&gt;/var/log/nginx/demo.mydomain.com_access.log&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kn"&gt;error_log&lt;/span&gt;  &lt;span class="n"&gt;/var/log/nginx/demo.mydomain.com_error.log&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c1"&gt;# letsencrypt生成的文件&lt;/span&gt;
  &lt;span class="kn"&gt;ssl_certificate&lt;/span&gt; &lt;span class="n"&gt;/etc/letsencrypt/live/demo.mydomain.com/fullchain.pem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kn"&gt;ssl_certificate_key&lt;/span&gt; &lt;span class="n"&gt;/etc/letsencrypt/live/demo.mydomain.com/privkey.pem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kn"&gt;ssl_session_timeout&lt;/span&gt; &lt;span class="s"&gt;1d&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kn"&gt;ssl_session_cache&lt;/span&gt; &lt;span class="s"&gt;shared:SSL:50m&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kn"&gt;ssl_session_tickets&lt;/span&gt; &lt;span class="no"&gt;on&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kn"&gt;ssl_dhparam&lt;/span&gt; &lt;span class="n"&gt;/etc/ssl/private/dhparam.pem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kn"&gt;ssl_protocols&lt;/span&gt; &lt;span class="s"&gt;TLSv1&lt;/span&gt; &lt;span class="s"&gt;TLSv1.1&lt;/span&gt; &lt;span class="s"&gt;TLSv1.2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="c1"&gt;# 一般推荐使用的ssl_ciphers值: https://wiki.mozilla.org/Security/Server_Side_TLS&lt;/span&gt;
  &lt;span class="kn"&gt;ssl_ciphers&lt;/span&gt; &lt;span class="s"&gt;'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128:AES256:AES:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kn"&gt;ssl_prefer_server_ciphers&lt;/span&gt; &lt;span class="no"&gt;on&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;在浏览器打开&lt;code&gt;http://demo.mydomain.com&lt;/code&gt;, 如果正常跳转到&lt;code&gt;https://demo.mydomain.com&lt;/code&gt;，就算成功了。
如果是 chrome 浏览器，在地址栏点击小锁的图标，可以查看证书的详情&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;</description>
      <author>samport</author>
      <pubDate>Tue, 20 Dec 2016 13:53:52 +0800</pubDate>
      <link>https://ruby-china.org/topics/31942</link>
      <guid>https://ruby-china.org/topics/31942</guid>
    </item>
    <item>
      <title>有没有实现 Rails 后台页面与微信用户实时聊天的方案？</title>
      <description>&lt;p&gt;目前正在开发的微信公众号项目中，希望增加微信的多用户客服聊天的功能。场景是微信客户发起一个实时聊天请求后，客服人员在电脑网页上能进行实时对话。对话的内容除了文字，也希望支持图片，音频等多媒体。各位高手能不能给个方案的思路？如果有样例代码就更好了。&lt;/p&gt;

&lt;p&gt;目前已经把&lt;a href="https://github.com/Eric-Guo/wechat" rel="nofollow" target="_blank" title=""&gt;https://github.com/Eric-Guo/wechat&lt;/a&gt;用作处理微信的会话接口，效果挺不错的，感谢作者！不知道能不能将这个 gem 与 ActionCable 组合去实现聊天功能？&lt;/p&gt;</description>
      <author>samport</author>
      <pubDate>Mon, 12 Dec 2016 18:05:52 +0800</pubDate>
      <link>https://ruby-china.org/topics/31888</link>
      <guid>https://ruby-china.org/topics/31888</guid>
    </item>
    <item>
      <title>Rails 公众号开发碰到的一个小坑: 公众号对接失败</title>
      <description>&lt;p&gt;开始做 Rails 的公众号项目，感觉这个开发模板正是我需要的：&lt;a href="https://github.com/goofansu/wechat-starter" rel="nofollow" target="_blank" title=""&gt;https://github.com/goofansu/wechat-starter&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;该项目默认是 pg 数据库，将其修改成 sqlite3 数据库以后，在 rails5 下很顺利的就能运行了。&lt;/p&gt;

&lt;p&gt;在阿里云上编译并运行了 ngrok 服务器端，在 mac 上编译了客户端，公网访问没有问题。但是在微信公众号平台配置服务器对接时候，死活通过不了：报 URL 超时错误或者是配置失败的错误。反复检查不得其解。&lt;/p&gt;

&lt;p&gt;偶然搜到了这个帖子&lt;a href="https://ruby-china.org/topics/26468" title=""&gt;https://ruby-china.org/topics/26468&lt;/a&gt;，似乎说可能是 puma 服务器返回有什么特别之处，导致微信公众号平台不识别。&lt;/p&gt;

&lt;p&gt;试了一下，将 Gem 里面的 puma 注释掉，然后重新启动 Rails 默认的 webrick 服务器，果然马上就对接成功。更神奇的是，公众号平台上的配置完成以后，将 Rails 服务器再改成 Puma，微信的消息应答完全没问题。&lt;/p&gt;

&lt;p&gt;现在还不清楚如果生产环境下 nginx+puma 是不是不会有这样的现象。另外，在微信官方的公众号管理平台上配置服务器对接时候，puma 和 webrick 返回的信息有何不同，也不明白，如果有人有这方面的研究，请分享一下。&lt;/p&gt;

&lt;p&gt;这个小坑足足害了我三个小时，太不值了。&lt;/p&gt;

&lt;p&gt;相关帖子：&lt;a href="https://ruby-china.org/topics/30957" title=""&gt;https://ruby-china.org/topics/30957&lt;/a&gt;&lt;/p&gt;</description>
      <author>samport</author>
      <pubDate>Tue, 06 Dec 2016 19:38:43 +0800</pubDate>
      <link>https://ruby-china.org/topics/31815</link>
      <guid>https://ruby-china.org/topics/31815</guid>
    </item>
    <item>
      <title>阿里云主机 (杭州机房) 访问 GitHub 太慢了</title>
      <description>&lt;p&gt;想在阿里云主机上安装配置一个 ngrok，用作微信接口的开发调试。安装脚本中实际上有好多访问 github 的请求，卡得基本上停滞了。ping 了一下 github.com，发现竟然有 370ms，还非常不稳定，不知道有没有什么办法加速阿里云主机访问 gihub 的速度？&lt;/p&gt;

&lt;p&gt;另外，有没有比较方便的服务器翻墙的方案？在不妨碍正常本地 web 服务的情况下。&lt;/p&gt;</description>
      <author>samport</author>
      <pubDate>Tue, 06 Dec 2016 13:34:54 +0800</pubDate>
      <link>https://ruby-china.org/topics/31812</link>
      <guid>https://ruby-china.org/topics/31812</guid>
    </item>
    <item>
      <title>Camaleon CMS, 一个接近 WordPress 的 Rails 版 CMS</title>
      <description>&lt;p&gt;也许是我孤陋寡闻吧，我就没看到过 Rails 有像样的 CMS 管理系统，多数都还停留在教学示例的程度。特别是编辑器里面插入图片，以及图片文件管理，和 WordPress 简直没法比。&lt;/p&gt;

&lt;p&gt;在谷歌上搜来搜去，找到一款接近 WordPress 的：Camaleon CMS，很有参考价值。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;亮点：编辑器图片上传功能，图片管理功能，分类和标签功能，基本的 SEO 功能，插件机制，前台可以更换模板，多语言，内置评论功能，联系表单功能。&lt;/li&gt;
&lt;li&gt;不足：用户登陆及文件上传功能好像是自己造的轮子，没有使用 devise 及 carrierwave，代码不太容易懂。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="http://camaleon.tuzitio.com/" rel="nofollow" target="_blank" title=""&gt;Camaleon CMS 官网&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://camaleon.tuzitio.com/plugins/demo_manage/" rel="nofollow" target="_blank" title=""&gt;Camaleon CMS Demo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/owen2345/camaleon-cms" rel="nofollow" target="_blank" title=""&gt;Camaleon CMS GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2016/80eea1dbb524e3ad9e5a26c0e2c67959.jpg!large" title="" alt="Camaleon CMS图片管理"&gt;&lt;/p&gt;</description>
      <author>samport</author>
      <pubDate>Sun, 06 Nov 2016 12:24:02 +0800</pubDate>
      <link>https://ruby-china.org/topics/31531</link>
      <guid>https://ruby-china.org/topics/31531</guid>
    </item>
    <item>
      <title>Turbolinks 5 下有没有可能让页面单独只执行自己的 JS/CoffeeScript</title>
      <description>&lt;p&gt;碰到一个页面 js 的小问题，发现自己对于 Turbolinks 了解太少了。&lt;/p&gt;

&lt;p&gt;例如首页上有个图片切换的 slide 幻灯片效果，看代码是使用 js 定时器，第一次打开首页时一切正常。&lt;/p&gt;

&lt;p&gt;点击其它页面以后，再返回到首页，幻灯片出现了闪动。页面调试发现浏览器这时候已经有两个 js 定时器在同时运转。初步分析结果是打开其它页面时，首页上的 js 代码又被引用，又产生了一个新的定时器任务。&lt;/p&gt;

&lt;p&gt;虽然可以通过追加一些 js 代码，将已经存在的定时器先清除，然后再执行新的 js 定时器，但是这个显然不是个好办法。使用了 turbolinks 以后所有的 js/coffeescript 一次性被读入以后，执行时候也是被全部执行的吗？如果不同页面上有相同的 js 变量，那不是会乱套吗？&lt;/p&gt;

&lt;p&gt;使用 turbolinks 时候，有没有让页面只执行该页面单独的 js 脚本的好办法？&lt;/p&gt;</description>
      <author>samport</author>
      <pubDate>Thu, 01 Sep 2016 16:27:13 +0800</pubDate>
      <link>https://ruby-china.org/topics/30964</link>
      <guid>https://ruby-china.org/topics/30964</guid>
    </item>
    <item>
      <title>Stripe 香港 Beta 版开通了</title>
      <description>&lt;p&gt;&lt;a href="https://stripe.com/hk/pricing" rel="nofollow" target="_blank" title=""&gt;Stripe 香港 Beta 版&lt;/a&gt;开通了！
&lt;del&gt;国内的朋友可以通过申请招商银行香港一卡通来获取一个香港银行账号，然后就可以用 HKD 来收款了。&lt;/del&gt;
&lt;strong&gt;好像如果要激活 Stripe 账号，个人用户的话还是需要一个香港身份证 ID 以及香港地址。看来此路不通&lt;/strong&gt;&lt;img title=":sob:" alt="😭" src="https://twemoji.ruby-china.com/2/svg/1f62d.svg" class="twemoji"&gt; &lt;/p&gt;

&lt;p&gt;虽然和 PayPal 的规模比起来 Stripe 只能算小弟，但是发展速度惊人。开发起来比 PayPal 要方便不少。另外付款方的用户体验也要比 PayPal 好很多。&lt;/p&gt;

&lt;p&gt;Rails 集成 Stripe 非常方便。除了官方的文档，强烈推荐这本电子书：&lt;a href="https://www.masteringmodernpayments.com/" rel="nofollow" target="_blank" title=""&gt;《Mastering Modern Payments》&lt;/a&gt;。59 刀。&lt;/p&gt;</description>
      <author>samport</author>
      <pubDate>Sat, 18 Jun 2016 20:55:06 +0800</pubDate>
      <link>https://ruby-china.org/topics/30313</link>
      <guid>https://ruby-china.org/topics/30313</guid>
    </item>
    <item>
      <title>Rails 项目的 bootstrap 等前端 asset 推荐用什么方式安装？</title>
      <description>&lt;p&gt;大家一般采用什么方式集成 bootstrap 等资源？&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;手工安装。直接去官网下载，然后只把 css, js 等文件放到 assets 相应的目录中&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;优点：能保证生产环境中只包含最精简的文件，可以灵活选用版本&lt;/li&gt;
&lt;li&gt;缺点：麻烦。有时候得修改里面的相对应用的目录，例如字体文件的引用目录&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;使用相关的 gem。例如&lt;code&gt;gem 'twitter-bootstrap-rails'&lt;/code&gt; 或者&lt;code&gt;gem 'bootstrap-sass'&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;优点：安装简便快捷。&lt;/li&gt;
&lt;li&gt;缺点：受制于人，例如该 gem 的更新频率。另外相同的前端资源往往在 github 上有多个 gem 可以选择，有时候不知道该选哪个。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;使用 bower 前端管理工具。（安装 gem "bower-rails"）&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;优点：安装快捷方便，而且安装目录在项目的 vendor/assets/bower_components 目录下，很容易检查安装了什么文件。&lt;/li&gt;
&lt;li&gt;缺点：安装的文件大而全，不光包含了精简文件，还包括了各种开发文件，以及样例文件，对于生产环境来说浪费空间资源。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;最近我在集成 rails + admin-lte 模板时，感觉到 rails 里面安装 bootstrap 等前端资源的可选方式比较多，反而让人不知道如何是好。所以想请问大家都推荐什么方式？&lt;/p&gt;</description>
      <author>samport</author>
      <pubDate>Mon, 06 Jun 2016 17:48:15 +0800</pubDate>
      <link>https://ruby-china.org/topics/30225</link>
      <guid>https://ruby-china.org/topics/30225</guid>
    </item>
    <item>
      <title>使用 PostgreSQL + pg_search 进行中文全文检索</title>
      <description>&lt;p&gt;在小型 Rails 项目中不借助 Elasticsearch 等专业的第三方搜索引擎，只使用 pg_search 进行全文检索其实是能够满足一般应用场景的。&lt;/p&gt;

&lt;p&gt;但是由于 postgresql 默认不支持中文分词的功能，所以需要额外为数据库配置一个中文分词的扩展。一个比较简单的中文分词的方案是采用 scws+ 中文字典库+zhparser 组合。另外，在 pg_search 调用时，需要指定在数据库设置的中文检索配置。除此以外就没有什么特别之处了。&lt;/p&gt;

&lt;p&gt;详细的安装过程请参照： &lt;a href="http://www.racksam.com/2016/05/03/chinese-full-text-searching-with-postgresql-zhparser-and-rails/#more" rel="nofollow" target="_blank" title=""&gt;PostgreSQL + SCWS + zhparser + Rails4 + pg_search 实现中文全文检索&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;在线演示：&lt;a href="http://demo.racksam.com/pg_search_chinese_japanese_demo/articles" rel="nofollow" target="_blank" title=""&gt;Full-text Searching Demo [Chinese/English/Japanese]&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;注：不管是 Rails 还是 Github，我都是初学者，难免有错误，欢迎大家指正。例如我还是搞不定那个 application_helper 里面的 link_activate 方法。如果项目不是放在子目录的话，就没问题，现在布置到子目录里面，菜单链接就没法显示 active 了。&lt;/em&gt;&lt;/p&gt;</description>
      <author>samport</author>
      <pubDate>Fri, 03 Jun 2016 16:30:28 +0800</pubDate>
      <link>https://ruby-china.org/topics/30207</link>
      <guid>https://ruby-china.org/topics/30207</guid>
    </item>
  </channel>
</rss>
