<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>cameo</title>
    <link>https://ruby-china.org/cameo</link>
    <description></description>
    <language>en-us</language>
    <item>
      <title>CSRF detected with omniauth and sinatra</title>
      <description>&lt;p&gt;我想测试一下微信公众平台 OAuth，写了一个简单的 sinatra 程序，用的是 omniauth-wechat-oauth2 gem。
但是跑起来到/auth/wechat/callback 的时候，总是抛出 CSRF detected。Google 了一圈，也不知道如何解决！
请教如何解决这个问题？&lt;/p&gt;

&lt;p&gt;我用的 omniauth gems:
omniauth (1.2.1)
omniauth-oauth2 (1.1.2)
omniauth-wechat-oauth2 (0.1.0)&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# app.rb&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'sinatra'&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'sinatra/json'&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'omniauth-wechat-oauth2'&lt;/span&gt;

&lt;span class="no"&gt;WECHAT_API_KEY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'xxxxxxxxxxxxxxxxxxxx'&lt;/span&gt;
&lt;span class="no"&gt;WECHAT_APP_SECRET&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'xxxxxxxxxxxxxxxxxxxx'&lt;/span&gt;

&lt;span class="n"&gt;enable&lt;/span&gt; &lt;span class="ss"&gt;:sessions&lt;/span&gt;

&lt;span class="n"&gt;use&lt;/span&gt; &lt;span class="no"&gt;OmniAuth&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Builder&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="n"&gt;provider&lt;/span&gt; &lt;span class="ss"&gt;:wechat&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;WECHAT_API_KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;WECHAT_APP_SECRET&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="n"&gt;get&lt;/span&gt; &lt;span class="s1"&gt;'/'&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&amp;lt;-&lt;/span&gt;&lt;span class="no"&gt;HTML&lt;/span&gt;&lt;span class="sh"&gt;
  &amp;lt;a href='/auth/wechat'&amp;gt;微信登录&amp;lt;/a&amp;gt;
&lt;/span&gt;&lt;span class="no"&gt;  HTML&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="n"&gt;post&lt;/span&gt; &lt;span class="s1"&gt;'/auth/wechat/callback'&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="n"&gt;auth&lt;/span&gt; &lt;span class="o"&gt;=&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;env&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'omniauth.auth'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;inspect&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="n"&gt;get&lt;/span&gt; &lt;span class="s1"&gt;'/auth/failure'&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="n"&gt;redirect&lt;/span&gt; &lt;span class="s1"&gt;'/'&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我另外写了个测 omniauth-github 的 sinatra 程序，完全没问题，不知道是不是 omniauth-wechat-oauth2 gem 的问题呢？&lt;/p&gt;</description>
      <author>cameo</author>
      <pubDate>Thu, 03 Jul 2014 01:01:12 +0800</pubDate>
      <link>https://ruby-china.org/topics/20285</link>
      <guid>https://ruby-china.org/topics/20285</guid>
    </item>
    <item>
      <title>Production 代码更新后如何重启 Puma</title>
      <description>&lt;p&gt;Heroku 有个功能，当 push 本地变化到 remote repository 以后，gems 自动重装，rails webserver 会自动重启。我的生产环境是 ubuntu+nginx+puma+git，请教如何实现类似效果以重启 puma 呢？&lt;/p&gt;

&lt;p&gt;我看到网上有人在/var/git/myproject.git/hooks/post-update 这样写。&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/sh&lt;/span&gt;

&lt;span class="nb"&gt;echo
echo&lt;/span&gt; &lt;span class="s2"&gt;"**** Pulling changes into Live [Linode's post-update hook]"&lt;/span&gt;
&lt;span class="nb"&gt;echo

cd&lt;/span&gt; /var/www/myproject &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;exit
unset &lt;/span&gt;GIT_DIR
git pull linode master
bundle &lt;span class="nb"&gt;install
sudo &lt;/span&gt;service nginx reload

&lt;span class="nb"&gt;exec &lt;/span&gt;git-update-server-info
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;但是没有如何加入重启 puma 的命令？谢谢！&lt;/p&gt;</description>
      <author>cameo</author>
      <pubDate>Mon, 26 May 2014 22:19:41 +0800</pubDate>
      <link>https://ruby-china.org/topics/19554</link>
      <guid>https://ruby-china.org/topics/19554</guid>
    </item>
    <item>
      <title>推立方短信 API 配置问题</title>
      <description>&lt;p&gt;一般来说，短信发送调用方式如下，&lt;/p&gt;

&lt;p&gt;&lt;a href="http://tui3.com/api/send/?k=&amp;amp;r=%E6%89%A7%E8%A1%8C%E7%BB%93%E6%9E%9C%E6%A0%BC%E5%BC%8F&amp;amp;p=%E7%9F%AD%E4%BF%A1%E4%BA%A7%E5%93%81id&amp;amp;t=%E6%8E%A5%E6%94%B6%E6%89%8B%E6%9C%BA%E5%8F%B7&amp;amp;c=%E5%8F%91%E9%80%81%E5%86%85%E5%AE%B9" rel="nofollow" target="_blank"&gt;http://tui3.com/api/send/?k=&amp;amp;r=执行结果格式&amp;amp;p=短信产品id&amp;amp;t=接收手机号&amp;amp;c=发送内容&lt;/a&gt;发送密钥&lt;/p&gt;

&lt;p&gt;可是我在本地测试发送的时候，得到返回消息：IP 地址非法。我看见推立方管网上的短信 API 配置说明中有一条：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;无论哪个通道，都要验证调用的 IP 地址。所以，请正确输入调用的 IP 地址。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;请问这是什么意思？难道每次给客户发短信的时候，还要验证调用 server 的 IP 地址？如何验证？&lt;/p&gt;

&lt;p&gt;谢谢！&lt;/p&gt;</description>
      <author>cameo</author>
      <pubDate>Mon, 19 May 2014 11:41:51 +0800</pubDate>
      <link>https://ruby-china.org/topics/19371</link>
      <guid>https://ruby-china.org/topics/19371</guid>
    </item>
    <item>
      <title>如何邀请微博好友加入网站？</title>
      <description>&lt;p&gt;请教如何邀请微博好友加入网站？有没有支持该功能的 Gem? 
感觉国外网站很多支持邀请 facebook, twitter 好友加入网站的，很方便呀。国内似乎很不方便&lt;/p&gt;</description>
      <author>cameo</author>
      <pubDate>Fri, 07 Feb 2014 00:02:05 +0800</pubDate>
      <link>https://ruby-china.org/topics/17093</link>
      <guid>https://ruby-china.org/topics/17093</guid>
    </item>
    <item>
      <title>FineUploader 如何删除已上传的图片</title>
      <description>&lt;p&gt;有一个像发微博那样的需求，要求上传并且能预览图片。找了一圈发现 ajaxUpload 控件里面 FineUploader 比较好，可是没有太多结合 Rails 的例子。我自己弄了半天，配合 carrierwave 可以上传图片了，但是不知道怎么通过删除预览图片来删除已上传的图片。比如客户端的'deleteFile'怎么填写？&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;deleteFile: {
                enabled: true,
                method: "DELETE",
                endpoint: "#{some_route_helper_method}"
            }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;问题是这个#{some_route_helper_method}怎么写，通常都要传入被删除对象实例或者 id 呀，如何得到？有没有人用过最新的 FineUploader，请教如何处理图片删除？&lt;/p&gt;</description>
      <author>cameo</author>
      <pubDate>Wed, 13 Nov 2013 12:31:14 +0800</pubDate>
      <link>https://ruby-china.org/topics/15507</link>
      <guid>https://ruby-china.org/topics/15507</guid>
    </item>
    <item>
      <title>关于 Mongoid 查询的奇怪问题</title>
      <description>&lt;p&gt;我有两个 Model 如下，奇怪的是如果我调用 Community 中的 activities 方法能返回查询结果，如果我直接查询 Activity 则无结果返回。百思不得其解呀！请看下面在 irb 中执行的结果，Mongoid::Criteria 的实例都一模一样！&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;Activity&lt;/span&gt;
  &lt;span class="kp"&gt;include&lt;/span&gt; &lt;span class="no"&gt;Mongoid&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Document&lt;/span&gt; 
  &lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
  &lt;span class="nf"&gt;field&lt;/span&gt; &lt;span class="n"&gt;target_object&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Community&lt;/span&gt;
  &lt;span class="kp"&gt;include&lt;/span&gt; &lt;span class="no"&gt;Mongoid&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Document&lt;/span&gt;
  &lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
  &lt;span class="nf"&gt;def&lt;/span&gt; &lt;span class="n"&gt;activities&lt;/span&gt;
    &lt;span class="no"&gt;Activity&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="n"&gt;target_object&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;"id"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"type"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"Community"&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;--------------------------------------------------华丽的分割线--------------------------------------
Activity 实例例子&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;irb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;span class="mo"&gt;002&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;Activity&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;last&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="c1"&gt;#&amp;lt;Activity _id: 51e615b4f9dffbed71000002, _type: nil, created_at: 2013-07-17 03:55:32 UTC, updated_at: 2013-07-17 03:55:32 UTC, verb: :new_article, actor: {"id"=&amp;gt;"51e3661af9dffbce7c000001", "type"=&amp;gt;"User"}, object: {"id"=&amp;gt;"51e615b4f9dffbed71000001", "type"=&amp;gt;"Article"}, target_object: {"id"=&amp;gt;"51e37648f9dffb5e4c000013", "type"=&amp;gt;"Community"}, receivers: [{"id"=&amp;gt;"51e3fb35f9dffbafff000001", "type"=&amp;gt;"User"}]&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;执行查询&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;irb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;span class="mo"&gt;006&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Community&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;first&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="c1"&gt;#&amp;lt;Community _id: 51e37648f9dffb5e4c000013, _type: nil, created_at: 2013-07-15 04:10:48 UTC, updated_at: 2013-07-15 14:15:05 UTC, name: "Biboo World", brief: "精彩水世界", user_ids: ["51e3661af9dffbce7c000001", "51e3fb35f9dffbafff000001"]&amp;gt;&lt;/span&gt;
&lt;span class="n"&gt;irb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;span class="mo"&gt;007&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;activities&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="c1"&gt;#&amp;lt;Mongoid::Criteria&lt;/span&gt;
  &lt;span class="ss"&gt;selector: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"target_object"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"51e37648f9dffb5e4c000013"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"type"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"Community"&lt;/span&gt;&lt;span class="p"&gt;}}&lt;/span&gt;
  &lt;span class="ss"&gt;options:  &lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;
  &lt;span class="ss"&gt;class:    &lt;/span&gt;&lt;span class="no"&gt;Activity&lt;/span&gt;
  &lt;span class="ss"&gt;embedded: &lt;/span&gt;&lt;span class="kp"&gt;false&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="n"&gt;irb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;main&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="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;activities&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;count&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt;


&lt;span class="n"&gt;irb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;span class="mo"&gt;015&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;Activity&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;target_object: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"51e37648f9dffb5e4c000013"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"type"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"Community"&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="c1"&gt;#&amp;lt;Mongoid::Criteria&lt;/span&gt;
  &lt;span class="ss"&gt;selector: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"target_object"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"51e37648f9dffb5e4c000013"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"type"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"Community"&lt;/span&gt;&lt;span class="p"&gt;}}&lt;/span&gt;
  &lt;span class="ss"&gt;options:  &lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;
  &lt;span class="ss"&gt;class:    &lt;/span&gt;&lt;span class="no"&gt;Activity&lt;/span&gt;
  &lt;span class="ss"&gt;embedded: &lt;/span&gt;&lt;span class="kp"&gt;false&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="n"&gt;irb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;span class="mo"&gt;014&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;  &lt;span class="no"&gt;Activity&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;target_object: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"51e37648f9dffb5e4c000013"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"type"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"Community"&lt;/span&gt;&lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nf"&gt;count&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>cameo</author>
      <pubDate>Sun, 21 Jul 2013 13:41:20 +0800</pubDate>
      <link>https://ruby-china.org/topics/12647</link>
      <guid>https://ruby-china.org/topics/12647</guid>
    </item>
    <item>
      <title>简单 Text Editor</title>
      <description>&lt;p&gt;想实现一个简单的 Text Editor，就像豆瓣写日记一样，仅支持添加链接和上传图片。&lt;/p&gt;

&lt;p&gt;请问有什么好的 Gem 或者 javascript 插件推荐？只要轻量级，不需要太重的 text editor&lt;/p&gt;</description>
      <author>cameo</author>
      <pubDate>Thu, 18 Jul 2013 12:23:06 +0800</pubDate>
      <link>https://ruby-china.org/topics/12585</link>
      <guid>https://ruby-china.org/topics/12585</guid>
    </item>
    <item>
      <title>如何得到或创建 Youku, Tudou,等网站视频的缩略图</title>
      <description>&lt;p&gt;我想嵌入国内主流视频网站如 youku,tudou 等的视频，如何得到视频的缩略图？我觉得这应该是一个挺普遍的问题吧。&lt;/p&gt;

&lt;p&gt;不要那种扒视频网址页面代码的方法，谢谢！&lt;/p&gt;</description>
      <author>cameo</author>
      <pubDate>Fri, 12 Jul 2013 13:20:31 +0800</pubDate>
      <link>https://ruby-china.org/topics/12457</link>
      <guid>https://ruby-china.org/topics/12457</guid>
    </item>
    <item>
      <title>如何实现 hit counter 功能</title>
      <description>&lt;p&gt;请教如何能实现 Model，比如 blog，article 的 hit counter 功能，用的是 Mongoid。有没有适合的 gem 之类的？&lt;/p&gt;

&lt;p&gt;我看 Ruby China 的源代码里 Topic.rb 中有一行
counter :hits&lt;/p&gt;

&lt;p&gt;然后 TopicsController 中 show action 有一行
&lt;a href="/topic.hits.incr" class="user-mention" title="@topic.hits.incr"&gt;&lt;i&gt;@&lt;/i&gt;topic.hits.incr&lt;/a&gt;(1)&lt;/p&gt;

&lt;p&gt;counter method 与 incr method 都是哪儿来的？Ruby China 能实现 unique count by request 么？&lt;/p&gt;

&lt;p&gt;谢谢！&lt;/p&gt;</description>
      <author>cameo</author>
      <pubDate>Tue, 09 Jul 2013 15:43:26 +0800</pubDate>
      <link>https://ruby-china.org/topics/12372</link>
      <guid>https://ruby-china.org/topics/12372</guid>
    </item>
  </channel>
</rss>
