<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>huopo125 (欲登高)</title>
    <link>https://ruby-china.org/huopo125</link>
    <description></description>
    <language>en-us</language>
    <item>
      <title>[上海] (已完成) 美国创业公司 Robin8 诚聘初、中 Ruby 工程师 2 名</title>
      <description>&lt;h3 id="先说说我们"&gt;先说说我们&lt;/h3&gt;
&lt;p&gt;Robin8 Inc. 是来自美国纽约的高科技公司，我们的产品帮助进行社交营销公关的用户更高效地使用大数据，优化其媒体选择和效果。该模式已经在美国市场的测试取得成绩，目前我们在成立中国团队并开发更加适应国情的数据平台和产品。&lt;strong&gt;&lt;em&gt;中国技术团队由于业务需要，诚邀您的加入!!&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id="薪资、福利："&gt;薪资、福利：&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;10K－20K／月，五险一金，交通、餐饮补贴&lt;/li&gt;
&lt;li&gt;正常带薪休假及体检福利&lt;/li&gt;
&lt;li&gt;员工股权激励（可选）&lt;/li&gt;
&lt;li&gt;开放的办公室和工作氛围（不打卡）&lt;/li&gt;
&lt;li&gt;在有全球化团队流转需要时，我们还可以申请 H1B 签证帮助您在美国工作&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="我们希望您："&gt;我们希望您：&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;1-3 年 Ruby on Rails 开发经验;&lt;/li&gt;
&lt;li&gt;熟悉 Ruby on Rails，Ruby 生态环境，和各种常用 Gems；&lt;/li&gt;
&lt;li&gt;熟悉 JavaScript 和 CSS，了解常见前端框架/基础类库；熟悉 HTML，了解 HTML5 特性；&lt;/li&gt;
&lt;li&gt;使用过至少一种关系型或者 NoSQL 数据库；&lt;/li&gt;
&lt;li&gt;使用过至少一种版本控制工具；&lt;/li&gt;
&lt;li&gt;了解 Linux，Nginx 等上下游相关环境，能部署和优化 Web 项目；&lt;/li&gt;
&lt;li&gt;对产品可用性和易用性有要求，对新兴技术有好奇；&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;当然如果您没有 Rails 经验，只要您愿意学，我们也是乐意带您一起成长。&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;您大部分的工作时间会是在 Rails 服务器端编程。与此同时，您会知道市场／公关／社交媒体领域的最新动向，并思考如何将其转化为产品；也可以了解或参与机器学习／自然语言处理和大规模数据处理项目；或是参与到任何感兴趣并能胜任的企业方向。&lt;/p&gt;

&lt;p&gt;请将您的简历发送到：&lt;em&gt;luffyhe@robin8.com&lt;/em&gt; ；&lt;/p&gt;

&lt;p&gt;公司地址：上海市静安区愚园路 20 号东海广场 3 号楼 15 楼 创客中心；（1 月份将搬到江宁路 77 号，靠近南京西路）&lt;/p&gt;

&lt;p&gt;公司网址：www.robin8.net。&lt;/p&gt;
&lt;h3 id="补充说明"&gt;补充说明&lt;/h3&gt;
&lt;p&gt;实习生 我们也是需要的，只要你足够聪明，那就来吧。&lt;/p&gt;</description>
      <author>huopo125</author>
      <pubDate>Mon, 14 Dec 2015 16:10:26 +0800</pubDate>
      <link>https://ruby-china.org/topics/28381</link>
      <guid>https://ruby-china.org/topics/28381</guid>
    </item>
    <item>
      <title>Mac 运行 redis-server 总是运行的是 2.6 版本</title>
      <description>&lt;p&gt;使用 brew 安装 redis 后，redis-server 却总是运行系统的旧版本。
使用&lt;code&gt;/usr/local/bin/redis-server&lt;/code&gt;启动的才是 brew 安装的版本，请问 redis-server 是调用的哪里的 bin 文件，如何进行更换？&lt;/p&gt;</description>
      <author>huopo125</author>
      <pubDate>Thu, 15 Oct 2015 10:42:11 +0800</pubDate>
      <link>https://ruby-china.org/topics/27680</link>
      <guid>https://ruby-china.org/topics/27680</guid>
    </item>
    <item>
      <title>Rails 应该如何添加 SendCloud 的 SMTP 配置使用标签功能？</title>
      <description>&lt;p&gt;官方文档：
    验证 API_USER 时将标签 ID ( label_id ) 拼接在后面即可，拼接规则:
    &lt;code&gt;api_user + '#' + label_id&lt;/code&gt;
以下是官方的&lt;a href="http://sendcloud.sohu.com/doc/faq/#7-smtp" rel="nofollow" target="_blank" title=""&gt;python 代码&lt;/a&gt;&lt;/p&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;python&lt;/span&gt; &lt;span class="n"&gt;代码片段&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;

&lt;span class="c1"&gt;# 不使用标签接入:
&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;SMTP&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;%s:%d&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;HOST&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;PORT&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set_debuglevel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DEBUG_MODE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;USE_SSL&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;starttls&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;login&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;API_USER&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;API_KEY&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 使用标签接入:
&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;SMTP&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;%s:%d&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;HOST&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;PORT&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set_debuglevel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DEBUG_MODE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;USE_SSL&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;starttls&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;login&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;API_USER&lt;/span&gt; &lt;span class="o"&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="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;label_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;API_KEY&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我使用 ruby 的&lt;a href="http://sendcloud.sohu.com/sendcloud/api-doc/smtp-api-ruby-examples" rel="nofollow" target="_blank" title=""&gt;mail&lt;/a&gt;也可以实现，但是配置到 Rails 中，却无法成功配置标签，反而可以正常发送，有人碰到这个问题吗？&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;ActionMailer&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Base&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;smtp_settings&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="ss"&gt;:address&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"smtpcloud.sohu.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="ss"&gt;:port&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="p"&gt;,&lt;/span&gt;
  &lt;span class="ss"&gt;:authentication&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="ss"&gt;:login&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="ss"&gt;:domain&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'&amp;lt;your_domain&amp;gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="ss"&gt;:user_name&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;api_user&amp;gt;#&amp;lt;labelId&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="ss"&gt;:password&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;password&amp;gt;"&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我想，既然 SendCloud 可以正常发送，那么应该是识别了 user_name 的，但是不知为何不识别 lableId……&lt;/p&gt;</description>
      <author>huopo125</author>
      <pubDate>Wed, 15 Jul 2015 11:17:07 +0800</pubDate>
      <link>https://ruby-china.org/topics/26494</link>
      <guid>https://ruby-china.org/topics/26494</guid>
    </item>
    <item>
      <title>UJS + SJR + Assets Pipeline + Turbolinks 资料</title>
      <description>&lt;p&gt;最近在帖子里面看到&lt;a href="https://ruby-china.org/topics/25279#reply14" title=""&gt;UJS + SJR + Assets Pipeline + Turbolinks&lt;/a&gt;，自己搜罗了一些资料，搬运来方便学习 &lt;img title=":smile:" alt="😄" src="https://twemoji.ruby-china.com/2/svg/1f604.svg" class="twemoji"&gt;   &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;UJS(资料来源 Guides)：

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/rails/jquery-ujs/wiki" rel="nofollow" target="_blank" title=""&gt;jquery-ujs wiki&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.alfajango.com/blog/rails-3-remote-links-and-forms/" rel="nofollow" target="_blank" title=""&gt;Rails 3 Remote Links and Forms: A Definitive Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.alfajango.com/blog/rails-3-remote-links-and-forms-data-type-with-jquery/" rel="nofollow" target="_blank" title=""&gt;Rails 3 Remote Links and Forms Part 2: Data-type with jQuery&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.alfajango.com/blog/rails-jquery-ujs-now-interactive/" rel="nofollow" target="_blank" title=""&gt;Rails jQuery UJS: Now Interactive and Customizable with the $.rails object&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.bigbinary.com/2012/05/11/jquery-ujs-and-jquery-trigger.html" rel="nofollow" target="_blank" title=""&gt;jquery-ujs and jquery trigger&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://robots.thoughtbot.com/a-tour-of-rails-jquery-ujs" rel="nofollow" target="_blank" title=""&gt;A Tour of Rails' jQuery UJS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.alfajango.com/blog/new-ajax-aborted-rails-jquery-ujs-callbacks/" rel="nofollow" target="_blank" title=""&gt;New ajax:aborted Rails jQuery UJS Hooks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://railscasts.com/episodes/205-unobtrusive-javascript" rel="nofollow" target="_blank" title=""&gt;Railscasts: Unobtrusive JavaScript&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;SJR：&lt;br&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://signalvnoise.com/posts/3697-server-generated-javascript-responses" rel="nofollow" target="_blank" title=""&gt;Server-generated JavaScript Responses&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.oschina.net/translate/server-generated-javascript-responses" rel="nofollow" target="_blank" title=""&gt;服务器端生成的 JavaScript 响应 (中文版)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Assets Pipeline:&lt;br&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://guides.rubyonrails.org/asset_pipeline.html" rel="nofollow" target="_blank" title=""&gt;The Asset Pipeline(Guides)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://guides.ruby-china.org/asset_pipeline.html" rel="nofollow" target="_blank" title=""&gt;The Asset Pipeline(中文版)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ihower.tw/rails4/assets-pipeline.html" rel="nofollow" target="_blank" title=""&gt;Asset Pipeline(实战圣经)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Turbolinks：&lt;br&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://guides.rubyonrails.org/working_with_javascript_in_rails.html#how-turbolinks-works" rel="nofollow" target="_blank" title=""&gt;how turbolinks works(Guides)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://guides.ruby-china.org/working_with_javascript_in_rails.html#turbolinks-%E7%9A%84%E5%B7%A5%E4%BD%9C%E5%8E%9F%E7%90%86" rel="nofollow" target="_blank" title=""&gt;Turbolinks 的工作原理 (中文版)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/rails/turbolinks" rel="nofollow" target="_blank" title=""&gt;turbolinks(Github)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://railscasts.com/episodes/390-turbolinks" rel="nofollow" target="_blank" title=""&gt;Railscasts: Turbolinks&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <author>huopo125</author>
      <pubDate>Sat, 25 Apr 2015 10:42:27 +0800</pubDate>
      <link>https://ruby-china.org/topics/25310</link>
      <guid>https://ruby-china.org/topics/25310</guid>
    </item>
    <item>
      <title>Rails 3 和 Rails 4 中 ETags 工作原理</title>
      <description>&lt;p&gt;最近和朋友交流的时候，发现有人误以为 ETags 机制是直接通过服务器内存中已保存的信息进行匹配，不需要 Rails 再次生成。其实该结论在 ruby-china 一篇经典帖子 (评论更经典) 中已有结论：&lt;a href="https://ruby-china.org/topics/19389" title=""&gt;总结 web 应用中常用的各种 cache&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="首次翻译发布，欢迎大家拍砖:)"&gt;首次翻译发布，欢迎大家拍砖:)&lt;/h2&gt;
&lt;p&gt;Etags 是一种 Web 缓存验证机制，并且允许客户端进行缓存协商，能够更加高效的利用客户端的缓存。&lt;/p&gt;
&lt;h4 id="Rails 3 和Rails 4默认使用的Etags机制工作原理"&gt;Rails 3 和 Rails 4 默认使用的 Etags 机制工作原理&lt;/h4&gt;
&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2015/3fd134e56705ceca9b56e5009883bde5.png" title="" alt="Rails 3 和Rails 4默认使用的Etags机制工作原理"&gt;
如图，假设我们即将访问一个博客，并请求该博客的列表页面：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;首个请求：

&lt;ul&gt;
&lt;li&gt;浏览器初始化首个请求&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;首个响应：

&lt;ul&gt;
&lt;li&gt;Rails 生成响应内容&lt;/li&gt;
&lt;li&gt;Rails 生成 ETag&lt;/li&gt;
&lt;li&gt;Rails 响应请求，响应信息中带有 ETag 头和状态码 200
浏览器在接收到响应页面后，将缓存该页面。当浏览器在处理后续的请求的时，步骤如下：&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;后续请求

&lt;ul&gt;
&lt;li&gt;浏览器发送头部信息带有'If-None-Matched'(存储的是 Etag 值) 的请求&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;后续响应

&lt;ul&gt;
&lt;li&gt;Rails 生成响应内容和 ETag&lt;/li&gt;
&lt;li&gt;比较生成的 ETag 和请求中'If-None-Matched'字段的值&lt;/li&gt;
&lt;li&gt;若 ETag 相同，生成的响应内容将不返回浏览器，而将返回 304 状态码&lt;/li&gt;
&lt;li&gt;若 ETag 不相同，将返回新的 ETag 值和生成的响应内容&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="Etag的优势"&gt;Etag 的优势&lt;/h4&gt;
&lt;p&gt;那么，使用 ETag 机制来匹配服务器上的内容有什么好处呢？好处就是 Rails 将不发送生成的页面内容，这样响应体将变的更小从而使得其网络中的传输速度更快。浏览器通过加载自身缓存中的内容，使得网站刷新更快，体验更好。&lt;/p&gt;
&lt;h4 id="ETag的使用"&gt;ETag 的使用&lt;/h4&gt;
&lt;p&gt;在 Rails 中，已经默认使用 ETag 机制，不需要额外操作，以下代码将自动使用 Rails 的默认 ETag 缓存机制&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;PostsController&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;ApplicationController&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;show&lt;/span&gt;
    &lt;span class="vi"&gt;@post&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:id&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

    &lt;span class="n"&gt;respond_to&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="nb"&gt;format&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
      &lt;span class="nb"&gt;format&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;html&lt;/span&gt; &lt;span class="c1"&gt;# show.html.erb&lt;/span&gt;
      &lt;span class="nb"&gt;format&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;render&lt;/span&gt; &lt;span class="ss"&gt;json: &lt;/span&gt;&lt;span class="vi"&gt;@post&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;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;edit&lt;/span&gt;
    &lt;span class="vi"&gt;@post&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:id&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;那么 Rails 是如何生成 ETag 信息的呢？
首先，Rails 生成响应内容，并根据生成的响应内容生成 MD5 散列的 ETag，代码类似：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'ETag'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Digest&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;MD5&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hexdigest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h4 id="ETags自定义的ETag"&gt;ETags 自定义的 ETag&lt;/h4&gt;
&lt;p&gt;通过每次生成的响应内容来生成 ETag 并不能高效的利用服务器，因为这样服务器将耗时调用数据库和渲染模板文件。
如何避免呢？
方法就是通过 Rails 的 helper 方法 fresh_when 和 stale？来实现。
示例代码：&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;PostsController&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;ApplicationController&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;show&lt;/span&gt;
    &lt;span class="vi"&gt;@post&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:id&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;stale?&lt;/span&gt; &lt;span class="vi"&gt;@post&lt;/span&gt;
      &lt;span class="n"&gt;respond_to&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="nb"&gt;format&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
        &lt;span class="nb"&gt;format&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;html&lt;/span&gt; &lt;span class="c1"&gt;# show.html.erb&lt;/span&gt;
        &lt;span class="nb"&gt;format&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;render&lt;/span&gt; &lt;span class="ss"&gt;json: &lt;/span&gt;&lt;span class="vi"&gt;@post&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;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;edit&lt;/span&gt;
    &lt;span class="vi"&gt;@post&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:id&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="n"&gt;fresh_when&lt;/span&gt; &lt;span class="vi"&gt;@post&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;那么代码中 rails 是如何生成 ETags 呢？
Rails 中 helper 方法 stale？和 fresh_when 实现原理如下：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'ETag'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Digest&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;MD5&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hexdigest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vi"&gt;@post.cache_key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;cache_key&lt;/code&gt;是结合了&lt;code&gt;model_name/model.id-model.updated_at&lt;/code&gt;。对于 Post 模型来说，&lt;code&gt;cache_key&lt;/code&gt;形式将是：&lt;code&gt;post/123-201312121212&lt;/code&gt;&lt;/p&gt;
&lt;h4 id="什么时候使用fresh_when和stale?方法，它们之间有什么区别？"&gt;什么时候使用 fresh_when 和 stale？方法，它们之间有什么区别？&lt;/h4&gt;
&lt;p&gt;若你有特定的响应处理（如下面代码中的 show 动作），请使用 stale？方法；若你没有特定的响应处理，例如你不需要使用 respond_to 或调用 render 方法（如下面代码中的 edit 和 recent 动作），请使用 fresh_when。&lt;/p&gt;
&lt;h4 id="自定义ETag的生成 (请注意：该小节的示例代码只是用来说明如何自定义，实际使用中请勿模仿！)"&gt;自定义 ETag 的生成 (请注意：该小节的示例代码只是用来说明如何自定义，实际使用中请勿模仿！)&lt;/h4&gt;
&lt;p&gt;假如你缓存是基于 current_user 或 current_customer，可以通过传入 Hash 格式的参数来生成自己的 ETag。
示例代码如下：&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;PostsController&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;ApplicationController&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;show&lt;/span&gt;
    &lt;span class="vi"&gt;@post&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:id&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;stale?&lt;/span&gt; &lt;span class="vi"&gt;@post&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;current_user_id: &lt;/span&gt;&lt;span class="n"&gt;current_user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;id&lt;/span&gt;
      &lt;span class="n"&gt;respond_to&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="nb"&gt;format&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
        &lt;span class="nb"&gt;format&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;html&lt;/span&gt; &lt;span class="c1"&gt;# show.html.erb&lt;/span&gt;
        &lt;span class="nb"&gt;format&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;render&lt;/span&gt; &lt;span class="ss"&gt;json: &lt;/span&gt;&lt;span class="vi"&gt;@post&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;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;edit&lt;/span&gt;
    &lt;span class="vi"&gt;@post&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:id&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="n"&gt;fresh_when&lt;/span&gt; &lt;span class="vi"&gt;@post&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;current_user_id: &lt;/span&gt;&lt;span class="n"&gt;current_user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;id&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;recent&lt;/span&gt;
    &lt;span class="vi"&gt;@post&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:id&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="n"&gt;fresh_when&lt;/span&gt; &lt;span class="vi"&gt;@post&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;current_user_id: &lt;/span&gt;&lt;span class="n"&gt;current_user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;id&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;h4 id="Rails 4中的声明式ETag特性"&gt;Rails 4 中的声明式 ETag 特性&lt;/h4&gt;
&lt;p&gt;聪明的你一定发现，以上一些代码中有些代码冗余，我们要 DRY！这里就是 Rails4 引入的 ETags 声明特性发挥威力的时候了。
Rails 3 和 Rails 4 都默认使用 ETags 机制处理浏览器缓存。但 Rails 4 添加了声明式 ETags 特性，该特性允许你在控制器中添加全局的 Etag 信息。
示例代码：&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;PostsController&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;ApplicationController&lt;/span&gt;
&lt;span class="n"&gt;etag&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;current_user&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="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;show&lt;/span&gt;
    &lt;span class="vi"&gt;@post&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:id&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;stale?&lt;/span&gt; &lt;span class="vi"&gt;@post&lt;/span&gt;
      &lt;span class="n"&gt;respond_to&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="nb"&gt;format&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
        &lt;span class="nb"&gt;format&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;html&lt;/span&gt; &lt;span class="c1"&gt;# show.html.erb&lt;/span&gt;
        &lt;span class="nb"&gt;format&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;render&lt;/span&gt; &lt;span class="ss"&gt;json: &lt;/span&gt;&lt;span class="vi"&gt;@post&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;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;edit&lt;/span&gt;
    &lt;span class="vi"&gt;@post&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:id&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="n"&gt;fresh_when&lt;/span&gt; &lt;span class="vi"&gt;@post&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;recent&lt;/span&gt;
    &lt;span class="vi"&gt;@post&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:id&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="n"&gt;fresh_when&lt;/span&gt; &lt;span class="vi"&gt;@post&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;你可以生成多个 ETags：&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;PostsController&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;ApplicationController&lt;/span&gt;
  &lt;span class="n"&gt;etag&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;current_user&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="n"&gt;etag&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;current_customer&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="c1"&gt;# ...&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;你也能够设置 ETags 的生成条件：&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;PostsController&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;ApplicationController&lt;/span&gt;
  &lt;span class="n"&gt;etag&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="ss"&gt;current_user_id: &lt;/span&gt;&lt;span class="n"&gt;current_user&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="k"&gt;if&lt;/span&gt; &lt;span class="sx"&gt;%w(show edit)&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;include?&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:action&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;h3 id="注意：声明式ETags并不支持:only,:if参数选项"&gt;注意：声明式 ETags 并不支持&lt;code&gt;:only&lt;/code&gt;,&lt;code&gt;:if&lt;/code&gt;参数选项&lt;/h3&gt;
&lt;p&gt;翻译自：&lt;a href="http://mohanraj-nagasamy.github.io/blog/2014/02/22/browser-cache-how-etags-works-in-rails-3-and-rails-4/" rel="nofollow" target="_blank" title=""&gt;Browser Cache: How ETags Works in Rails 3 and Rails 4&lt;/a&gt;&lt;/p&gt;</description>
      <author>huopo125</author>
      <pubDate>Sat, 04 Apr 2015 12:16:09 +0800</pubDate>
      <link>https://ruby-china.org/topics/24996</link>
      <guid>https://ruby-china.org/topics/24996</guid>
    </item>
    <item>
      <title>Vivaldi: Opera 的继承者</title>
      <description>&lt;blockquote&gt;
&lt;p&gt;Our Story&lt;/p&gt;

&lt;p&gt;In 1994, two programmers started working on a web browser. Our idea was to make a really fast browser, capable of running on limited hardware, keeping in mind that users are individuals with their own requirements and wishes. Opera was born. Our little piece of software gained traction, our group grew and a community was created. We stayed close to our users and to our roots. We kept improving our software, based on our users feedback, as well as our own ideas on how to make a great browser. We innovated and we strove for excellence.&lt;/p&gt;

&lt;p&gt;Fast forward to 2015, the browser we once loved has changed its direction. Sadly, it is no longer serving its community of users and contributors who helped build the browser in the first place.  &lt;/p&gt;
&lt;h2 id="SO WE CAME TO A NATURAL CONCLUSION:"&gt;SO WE CAME TO A NATURAL CONCLUSION:&lt;/h2&gt;
&lt;p&gt;We must make a new browser. A browser for ourselves and a browser for our friends. A browser that is fast, but also a browser that is rich in functionality, highly flexible and puts the user first. A browser that is made for you.&lt;/p&gt;
&lt;/blockquote&gt;</description>
      <author>huopo125</author>
      <pubDate>Mon, 09 Mar 2015 14:01:23 +0800</pubDate>
      <link>https://ruby-china.org/topics/24539</link>
      <guid>https://ruby-china.org/topics/24539</guid>
    </item>
    <item>
      <title>请问大家使用带有表情的富文本编辑框使用的都是哪些插件？</title>
      <description>&lt;p&gt;&lt;strong&gt;&lt;em&gt;如题，希望大家推荐一些富文本编辑插件，如 CKEditor&lt;/em&gt;&lt;/strong&gt;
&lt;strong&gt;先谢谢大家！&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;谢谢大家的帮助，请假一下，像雪球和微博那样的轻量级编辑框有没有推荐的？&lt;/strong&gt;&lt;/p&gt;</description>
      <author>huopo125</author>
      <pubDate>Tue, 27 Jan 2015 11:18:37 +0800</pubDate>
      <link>https://ruby-china.org/topics/23960</link>
      <guid>https://ruby-china.org/topics/23960</guid>
    </item>
    <item>
      <title>Mongodb 如何实现 Group 查询语句</title>
      <description>&lt;p&gt;&lt;strong&gt;我想实现对 message 表 sr_ids 字段的 group 查询，网上搜索了一些解决方法，但是有点看不懂，求教了。&lt;/strong&gt;&lt;/p&gt;</description>
      <author>huopo125</author>
      <pubDate>Thu, 18 Sep 2014 13:30:06 +0800</pubDate>
      <link>https://ruby-china.org/topics/21584</link>
      <guid>https://ruby-china.org/topics/21584</guid>
    </item>
    <item>
      <title>请教关于 bullet 的 “Unused eager loading” 提示</title>
      <description>&lt;p&gt;使用 bullet 经常遇到如下的提示，但是按照提示更改后又会出现 N+1 问题，想请教有关 Rails 的 eager loading 主要做什么？&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;Unused&lt;/span&gt; &lt;span class="no"&gt;Eager&lt;/span&gt; &lt;span class="no"&gt;Loading&lt;/span&gt; &lt;span class="n"&gt;detected&lt;/span&gt;
  &lt;span class="no"&gt;Oa&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Hotelapp&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;:user&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="no"&gt;Remove&lt;/span&gt; &lt;span class="n"&gt;from&lt;/span&gt; &lt;span class="n"&gt;your&lt;/span&gt; &lt;span class="ss"&gt;finder: :include&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;:user&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>huopo125</author>
      <pubDate>Sun, 24 Aug 2014 14:33:51 +0800</pubDate>
      <link>https://ruby-china.org/topics/21200</link>
      <guid>https://ruby-china.org/topics/21200</guid>
    </item>
    <item>
      <title>[已解决] Rails 应用设计 UML，大家都使用什么软件？</title>
      <description>&lt;p&gt;&lt;strong&gt;最近我需要为 Rails 项目设计 UML，但发现大多 UML 工具无法很好的表达 Ruby，请教大家都是用什么工具，最好有在线的，本人使用的 Ubuntu 系统。&lt;/strong&gt;
&lt;strong&gt;感谢大家的回答，我决定使用 RubyMime&lt;/strong&gt;
&lt;strong&gt;谢谢你们，我觉得获益不少。&lt;/strong&gt;&lt;/p&gt;</description>
      <author>huopo125</author>
      <pubDate>Fri, 22 Aug 2014 07:58:32 +0800</pubDate>
      <link>https://ruby-china.org/topics/21172</link>
      <guid>https://ruby-china.org/topics/21172</guid>
    </item>
    <item>
      <title>[已解决] 请教社区活动 PPT 问题： How to avoid 1.hour.hour?</title>
      <description>&lt;p&gt;&lt;strong&gt;无法看懂是如何避免此种操作的，求解...&lt;/strong&gt;&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;Duration&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;inspect&lt;/span&gt;
    &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="vi"&gt;@proxy&lt;/span&gt;
    &lt;span class="n"&gt;parts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sx"&gt;%w[days hours minutes seconds]&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;inject&lt;/span&gt;&lt;span class="p"&gt;([])&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;units&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;unit&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;unit&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;quotient&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;divmod&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;unit&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;units&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="n"&gt;quotient&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;unit&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;
      &lt;span class="k"&gt;else&lt;/span&gt;
        &lt;span class="n"&gt;units&lt;/span&gt;
      &lt;span class="k"&gt;end&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
    &lt;span class="n"&gt;parts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map!&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;unit&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;value&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="n"&gt;unit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chop&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;unit&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;parts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;', '&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;</description>
      <author>huopo125</author>
      <pubDate>Sun, 17 Aug 2014 18:40:15 +0800</pubDate>
      <link>https://ruby-china.org/topics/21069</link>
      <guid>https://ruby-china.org/topics/21069</guid>
    </item>
    <item>
      <title>如何实现 GitLab 与个人应用的帐号互通登录？</title>
      <description>&lt;p&gt;我想在其他应用中使用 gitlab 中注册的帐号，实现应用之间帐号的互通，请问下实现原理是什么，自己查找来一下看到一些 Omniauth-ldap，但是理解不了，请高手指点一下，谢谢！&lt;/p&gt;</description>
      <author>huopo125</author>
      <pubDate>Wed, 18 Jun 2014 14:14:08 +0800</pubDate>
      <link>https://ruby-china.org/topics/20023</link>
      <guid>https://ruby-china.org/topics/20023</guid>
    </item>
    <item>
      <title>请教如何对验证的错误提示信息，进行本地化</title>
      <description>&lt;p&gt;在看敏捷开发过程中，想将 rails 应用汉化，在对 errors 信息显示上遇到错误信息：
  &lt;code&gt;translation data {:address=&amp;gt;"住址", :name=&amp;gt;"姓名", :email=&amp;gt;"邮箱", :pay_type=&amp;gt;"支付方式"} can not be used with :count =&amp;gt; 1&lt;/code&gt;
&lt;strong&gt;1.zh-CN.yml&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;zh&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="no"&gt;CN&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="ss"&gt;errors:
    template:
      body: &lt;/span&gt;&lt;span class="s2"&gt;"错误信息如下："&lt;/span&gt;
      &lt;span class="ss"&gt;header:
        one: &lt;/span&gt;&lt;span class="s2"&gt;"%{model}有1个错误！"&lt;/span&gt;
        &lt;span class="ss"&gt;other: &lt;/span&gt;&lt;span class="s2"&gt;"%{model}有%{count}个错误！"&lt;/span&gt;
  &lt;span class="ss"&gt;activerecord:
    models:
      order: &lt;/span&gt;&lt;span class="s2"&gt;"订单"&lt;/span&gt;
      &lt;span class="ss"&gt;attributes:
      order:
        address: &lt;/span&gt;&lt;span class="s2"&gt;"住址"&lt;/span&gt;
        &lt;span class="ss"&gt;name: &lt;/span&gt;&lt;span class="s2"&gt;"姓名"&lt;/span&gt;
        &lt;span class="ss"&gt;email: &lt;/span&gt;&lt;span class="s2"&gt;"邮箱"&lt;/span&gt; 
        &lt;span class="ss"&gt;pay_type: &lt;/span&gt;&lt;span class="s2"&gt;"支付方式"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;2.view&lt;/strong&gt;
  &lt;code&gt;&amp;lt;h2&amp;gt;&amp;lt;%= raw t('errors.template.header', count: @order.errors.count, model: t('activerecord.models.order')) %&amp;gt;.&amp;lt;/h2&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;非常感谢朋友们的帮助，希望我这个新手早日成为一名高手，哈哈。
此问题已经解决，通过各位的指点，发现问题是出在我没有注意书中对 attributes 的缩进上，有点惭愧。
正确的格式是：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="ss"&gt;activerecord:
  models:
    order: &lt;/span&gt;&lt;span class="s2"&gt;"订单"&lt;/span&gt;
  &lt;span class="ss"&gt;attributes:
    order:
      address: &lt;/span&gt;&lt;span class="s2"&gt;"住址"&lt;/span&gt;
      &lt;span class="ss"&gt;name: &lt;/span&gt;&lt;span class="s2"&gt;"姓名"&lt;/span&gt;
      &lt;span class="ss"&gt;email: &lt;/span&gt;&lt;span class="s2"&gt;"邮箱"&lt;/span&gt; 
      &lt;span class="ss"&gt;pay_type: &lt;/span&gt;&lt;span class="s2"&gt;"支付方式"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>huopo125</author>
      <pubDate>Sat, 29 Mar 2014 12:05:37 +0800</pubDate>
      <link>https://ruby-china.org/topics/18244</link>
      <guid>https://ruby-china.org/topics/18244</guid>
    </item>
  </channel>
</rss>
