<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>merlinran (Merlin Ran)</title>
    <link>https://ruby-china.org/merlinran</link>
    <description></description>
    <language>en-us</language>
    <item>
      <title>有人想加入跨国远程团队吗？</title>
      <description>&lt;p&gt;国外远程办公现在蛮流行的，很多大公司和初创团队都是 remote friendly，甚至 remote first。坛子里也有人在享受远程的幸福生活吧。还有哪些同学想加入欧美的远程团队呢？举个爪，感兴趣的可以留个邮箱！&lt;/p&gt;

&lt;p&gt;参加过或想参加的同学们觉得跨国远程工作的最大障碍是什么呢，语言、时区、文化差异？&lt;/p&gt;</description>
      <author>merlinran</author>
      <pubDate>Sat, 19 Nov 2016 22:01:40 +0800</pubDate>
      <link>https://ruby-china.org/topics/31641</link>
      <guid>https://ruby-china.org/topics/31641</guid>
    </item>
    <item>
      <title>干货！Chongqing Hackup 精华分享</title>
      <description>&lt;p&gt;昨晚把首届 Chongqing Hackup 搞了。之前那个无人问津的召集在&lt;a href="https://ruby-china.org/topics/24623" title=""&gt;这里&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;还不错，畅所欲言。发出来，或许对大家有用呢？&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;今天聚会的各位 CEO 都如此成功了，还在拼命，小编怎么好意思偷懒？深夜加加班，把这些记录的精华发布出来。&lt;/p&gt;
&lt;h2 id="产品排期和工作量评估"&gt;产品排期和工作量评估&lt;/h2&gt;
&lt;p&gt;新晋创业者 Yeti，特别苦恼于新产品的进度。业务领域新，采用的技术也新，屡屡挖坑屡屡埋。难道没有更靠谱一点的办法吗？&lt;/p&gt;

&lt;p&gt;两位对交付项目非常有经验的老大总结道：在技术路线和业务领域相对熟悉的项目，按照经验估计的值，再加上&lt;strong&gt;30% 的余量&lt;/strong&gt;，就很靠谱了。当然，这是跟那些对 IT 有一定理解的客户。如果客户比较飘，思维发散多变，加个 100% 的余量也是可以的。而且，一定要&lt;strong&gt;重申需求变化的范围&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;如果是做产品，灵活度就比交付项目要高一些。可以确立小阶段内的整体目标，而非制定长期且固定的计划。小编所在的开源项目团队，是固定发布日期，按照紧急和重要程度，把需求/BUG 放入其中，算是暗合了 Scrum 吧。&lt;/p&gt;
&lt;h2 id="打造牛B技术团队"&gt;打造牛 B 技术团队&lt;/h2&gt;
&lt;p&gt;要排期准确，就需要熟悉业务，也要熟悉技术领域里的坑。二者都需要长期积累。业务需要浸淫，而如何打造一支坚实的技术团队，咱们的阿苏老大颇有心得。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; 每天的晨会&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;按照之前计划，当天要完成的事情，每位程序猿/媛来讲讲，准备如何去实现。如果想得不清楚，很快就会卡壳，团队就知道风险所在。有坑的地方，其他跌过坑的同事也可以指出来。&lt;/p&gt;

&lt;p&gt;另外这也是一种形式的同行评议，评价采用的技术路线，每一次探讨，都是进步的契机。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;每周五下午的内训，大家轮流讲 topic。主要基于两点考虑：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;能做出来不一定懂，能讲出来才是。&lt;/li&gt;
&lt;li&gt;工程师都是寂寞的，他们们写出了牛 X 的代码，也希望被人赞叹，希望登高一呼，群山喝彩。这是&lt;strong&gt;尊重了人性的规律&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;如何鼓励大家主动分享，又不带来压力呢？&lt;/p&gt;

&lt;p&gt;首先不要把时间定死，一个小组轮下来，就是俩月了。俩月的工作中，总能找到点儿东西分享的吧？&lt;/p&gt;

&lt;p&gt;那些实在懒惰的程序员，给点惩罚咯。每天下午茶时间的零食，你就负责跑腿。&lt;/p&gt;

&lt;p&gt;有负激励，也要有正激励。讲得好的同学，奖励纪念金币，可以兑换现金，放在桌上，那也是一种荣誉，可以显摆的啊！&lt;/p&gt;

&lt;p&gt;一个牛 B 的技术团队，要鼓励每位程序员，努力成为全栈，或者在通往全栈的路上。&lt;/p&gt;
&lt;h2 id="效率工具"&gt;效率工具&lt;/h2&gt;
&lt;p&gt;现在各种专业的工具越来越多，程序员兴奋异常！一款称手的工具，将大大提高生产力。&lt;/p&gt;

&lt;p&gt;团队协作工具，大家在使用的有&lt;a href="https://tower.im" rel="nofollow" target="_blank" title=""&gt;Tower&lt;/a&gt;和&lt;a href="https://www.teambition.com/" rel="nofollow" target="_blank" title=""&gt;Teambition&lt;/a&gt;，相较于上一代的产品，比如 Microsoft Project 和&lt;a href="https://www.atlassian.com/" rel="nofollow" target="_blank" title=""&gt;Atlassian&lt;/a&gt;的 JIRA，它们虽然功能不那么多，但更加轻量，更适合小团队的工作方式。&lt;/p&gt;

&lt;p&gt;对几个人窝在民宅里的创业团队，最高效的就是白板了。大面的玻璃墙，写写画画和便利贴。未来的 Facebook，未必不会从这里走出呢。&lt;/p&gt;

&lt;p&gt;有一款人肉测试服务，把 APK 提交上去，两天后给你把关键的点测得清清楚楚。不知道是不是&lt;a href="https://www.testelf.com/" rel="nofollow" target="_blank" title=""&gt;testelf&lt;/a&gt;，反正他们是做这个的。&lt;/p&gt;

&lt;p&gt;明玮兄提到一个服务&lt;a href="http://libraries.io" rel="nofollow" target="_blank"&gt;http://libraries.io&lt;/a&gt; 。它可以帮你跟踪项目中使用到的开源包，是否有升级更新，是解决了什么问题，就不用一直盯 GitHub 了。&lt;/p&gt;
&lt;h2 id="程序员的思维模式"&gt;程序员的思维模式&lt;/h2&gt;
&lt;p&gt;王老大遇到不少应聘的程序员，一门心思就想写&lt;strong&gt;原生代码&lt;/strong&gt;，纠结于每一行代码是不是自己拿手敲出来的（那不是打字员么？）。这种思维在两类人群中比较常见：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;做外包出身。之前都是找 CMS 改改就交给客户，所以特别希望找找从头写代码的感觉。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;学院派。比如那些计算机竞赛或者 Linux 的同学，觉得内核、算法才牛 B，越往底层越牛，恨不得拿代码写个 CPU 出来，看不起应用的人（小编当年狂啃 C++ 时，也是这样想的哦）。&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;特别明显的现象是重后端轻前端，觉得 JavaScript 是啥嘛？玩都不屑于玩的东西，还好意思称自己叫代码？但其实，前端的未来可能更加光明。平行类比制造业，质量多好、多高效，也许在过去的岁月、或者少数基础产业非常重要，但个性化和极具设计感的消费级产品，才是更广大的未来。&lt;/p&gt;
&lt;h2 id="论CEO的三种境界"&gt;论 CEO 的三种境界&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;第一种 CEO，身后背着一群团队成员，勉力前行。&lt;/li&gt;
&lt;li&gt;第二种 CEO，和团队并肩作战，同吃苦共受罪，就差大被同眠。&lt;/li&gt;
&lt;li&gt;第三种 CEO，团队在前面跑着，自己紧跟在后。前面说，来箱子弹，递上去；前面又说，口渴了，赶紧端茶递水。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;再往上一层，CEO 已经不做端茶递水的工作了，他专注于解决团队其他成员不能解决的问题，是什么呢？&lt;strong&gt;战略&lt;/strong&gt;（确定那不是懂事的长？）。&lt;/p&gt;
&lt;h2 id="论业务层的测试驱动"&gt;论业务层的测试驱动&lt;/h2&gt;
&lt;p&gt;为什么上测试驱动，实因切肤之痛。小团队很难找到专职测试，即便有，也难有充裕时间完整覆盖。随着代码的增加，问题会越来越明显。&lt;/p&gt;

&lt;p&gt;测试的核心，是让产品经理参与。产品经理规划测试用例，写 TODO list，把需求列表转化为可以执行的断言。JAVA 自然用 Maven，而 OC 就用 XCTest。&lt;/p&gt;

&lt;p&gt;我们知道，测试粒度有粗细，DAO - Service - Controller，每一级都可以引入测试。产品经理只能关注到业务层面，所以至少要覆盖 Controller 级。工程师在保证进度的前提下，可以自己在更小粒度上测试。&lt;/p&gt;

&lt;p&gt;代码质量除了用技术手段和流程来把控之外，也事关工程师的责任心和荣誉感。在春节加班改完团队的 BUG 之后，文艺老板迅疾组织讨论，题目就叫《程序员的自我修养》。&lt;/p&gt;

&lt;p&gt;从更高的视角看，按照墨菲定律，没有检查的地方，就一定会出问题。任何行业，关键地方一定要&lt;strong&gt;设立检查点&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;王老大高屋建瓴：测试驱动蛮好，敏捷开发蛮好，但关键在于，要&lt;strong&gt;在合适的时间做合适的事&lt;/strong&gt;。在某个项目中，老大并未耽于代码，而是在 14 天内六易设计稿，让客户拍案惊叹：这样的提供商，岂能不用！创业者的勤奋可见一斑。而这做事的思路，与现今流行的精益创业不谋而合。&lt;/p&gt;
&lt;h2 id="行业发展"&gt;行业发展&lt;/h2&gt;
&lt;p&gt;做外包的企业，几年之内就能看到未来成败。有机会成的，一定会扩大规模，项目越做越大。但成于大项目，更可能死于大项目。尤其现在的时代，90 后员工的想法已经完全变了，庞大的团队，将给管理带来巨大挑战。做产品，是条艰难重重的道路，但也是必然的选择。&lt;/p&gt;

&lt;p&gt;企业和个人的成功，极大地取决于运气。某总曾误打误撞进入国内技术的前沿，差一点就成为腾讯早期员工。与成为亿万富豪的机会失之交臂，可叹。但一朝展露头角，便可以进入圈子，资源共享和整合的机会就多起来，所以二次成功的机率就大大提高。&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;本期的干货就为您分享到这里。所以，可有兴趣一起玩？来跟咱们&lt;a href="https://jinshuju.net/f/Pp68t4" rel="nofollow" target="_blank" title=""&gt;对对眼&lt;/a&gt;吧。&lt;/p&gt;</description>
      <author>merlinran</author>
      <pubDate>Thu, 19 Mar 2015 11:07:06 +0800</pubDate>
      <link>https://ruby-china.org/topics/24719</link>
      <guid>https://ruby-china.org/topics/24719</guid>
    </item>
    <item>
      <title>【重庆】Chongqing Hackup 长期召集中……</title>
      <description>&lt;p&gt;Hackup 的几位创始成员都来自 Ruby China，特来这里首发。&lt;/p&gt;

&lt;p&gt;长期有效，入伙请戳这里：&lt;a href="https://jinshuju.net/f/Pp68t4" rel="nofollow" target="_blank"&gt;https://jinshuju.net/f/Pp68t4&lt;/a&gt;&lt;/p&gt;</description>
      <author>merlinran</author>
      <pubDate>Thu, 12 Mar 2015 22:22:54 +0800</pubDate>
      <link>https://ruby-china.org/topics/24623</link>
      <guid>https://ruby-china.org/topics/24623</guid>
    </item>
    <item>
      <title>wiki 里的链接全都木有了</title>
      <description>&lt;p&gt;我看了看代码&lt;/p&gt;
&lt;pre class="highlight erb"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"markdown-body"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="cp"&gt;&amp;lt;%=&lt;/span&gt; &lt;span class="n"&gt;sanitize&lt;/span&gt; &lt;span class="vi"&gt;@page.body_html&lt;/span&gt; &lt;span class="cp"&gt;%&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;是数据库里丢了么？&lt;/p&gt;</description>
      <author>merlinran</author>
      <pubDate>Thu, 09 Oct 2014 10:05:25 +0800</pubDate>
      <link>https://ruby-china.org/topics/21934</link>
      <guid>https://ruby-china.org/topics/21934</guid>
    </item>
    <item>
      <title>最简化的在线协同编辑产品</title>
      <description>&lt;p&gt;在参与筹办&lt;a href="http://www.tedxchongqing.com/" rel="nofollow" target="_blank" title=""&gt;TEDxChongqing&lt;/a&gt;的过程中，发现一个很麻烦的事情。团队成员大多是业余的，用微信沟通进展，反馈很及时，但刷屏严重，迟来一会儿，前面说的什么全忘了。成员来自各行各业，大家连邮件都不怎么看的，更别说&lt;a href="https://tower.im/" rel="nofollow" target="_blank" title=""&gt;Tower&lt;/a&gt;之类的协作工具了。&lt;/p&gt;

&lt;p&gt;因此，需要一个工具，让大伙儿对关键事情的理解在 same page 上。我设想的一个简化流程是：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; 访问网页，直接编辑内容（简单的文本即可），要求手机操作很方便&lt;/li&gt;
&lt;li&gt;把生成的链接，用 IM 发送给你的合作者们&lt;/li&gt;
&lt;li&gt; 任意拿到链接的合作者都可直接编辑，历史版本自动保存&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Google docs 可以共享编辑，但在手机上的编辑功能很弱，何况那堵墙还在呢。Zoho 和百会共享出去的都不能编辑。&lt;/p&gt;

&lt;p&gt;有其它现有的工具可以达到类似效果吗？&lt;/p&gt;

&lt;p&gt;如果没有，这似乎是一个很好的创业 idea，直接拿走，或者咱们一起做吧。&lt;/p&gt;</description>
      <author>merlinran</author>
      <pubDate>Mon, 06 Oct 2014 16:19:35 +0800</pubDate>
      <link>https://ruby-china.org/topics/21883</link>
      <guid>https://ruby-china.org/topics/21883</guid>
    </item>
    <item>
      <title>ajax 返回的页面通过脚本设置的 cookie，怎么破？</title>
      <description>&lt;p&gt;用 XmlHttpRequest 去访问现有的网站，大部分网页都通过 HTTP Set Cookie header 来设置 cookie，工作得很好。但其中一个页面通过 javascript 脚本设置了 Cookie：&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;script&lt;/span&gt; &lt;span class="nx"&gt;language&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;JavaScript&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="c"&gt;&amp;lt;!--&lt;/span&gt;
&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cookie&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;aaa=xxx; path=/; expires=...&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;//--&amp;gt;&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/script&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这就惨了。这段脚本并不会执行。手工把 cookie 内容提取出来也没用：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;在$http() 中加上&lt;code&gt;{headers: {'Cookie': 'aaa=xxx'}}&lt;/code&gt;，不允许。setHeader 报错&lt;code&gt;refused to set unsafe header cookie&lt;/code&gt;。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;自己设本地 cookie，同样因为安全的需要，不能设置 domain。&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <author>merlinran</author>
      <pubDate>Sat, 05 Oct 2013 10:14:57 +0800</pubDate>
      <link>https://ruby-china.org/topics/14539</link>
      <guid>https://ruby-china.org/topics/14539</guid>
    </item>
    <item>
      <title>[AngularJS] 怎么给 http interceptor 传递初始化参数？</title>
      <description>&lt;p&gt;Rich client 通常都有随时保证登录的需求，&lt;a href="https://github.com/witoldsz/angular-http-auth" rel="nofollow" target="_blank"&gt;https://github.com/witoldsz/angular-http-auth&lt;/a&gt; 这个 http interceptor，发现返回 401，就把 http request 缓存起来，验证通过之后再批量发出，处理逻辑很优雅。&lt;/p&gt;

&lt;p&gt;但我面对的是遗留系统，ajax 不返回 401，而是重定向到登录页面。所以，我希望做一些改进，传一个 Predicator 来判断是否需要登录。&lt;/p&gt;

&lt;p&gt;但 js 和 angular 的新手，实在不知如何实现，请高手点拨一二。&lt;/p&gt;</description>
      <author>merlinran</author>
      <pubDate>Mon, 30 Sep 2013 09:52:42 +0800</pubDate>
      <link>https://ruby-china.org/topics/14483</link>
      <guid>https://ruby-china.org/topics/14483</guid>
    </item>
    <item>
      <title>下周末在西安，求活动、参观、聊天</title>
      <description>&lt;p&gt;最近坛子流行沙发客，我也凑个热闹，争取搞成全国大串联。&lt;/p&gt;

&lt;p&gt;本人经历丰富，学艺博而不精，长居重庆蛮荒之地。主要在北关附近活动，有兴趣者速速勾搭。&lt;/p&gt;</description>
      <author>merlinran</author>
      <pubDate>Sun, 11 Aug 2013 23:09:56 +0800</pubDate>
      <link>https://ruby-china.org/topics/13257</link>
      <guid>https://ruby-china.org/topics/13257</guid>
    </item>
    <item>
      <title>[分享] 使用 User model 实现 OmniAuth 多 provider 和 Identity 登录</title>
      <description>&lt;p&gt;OmniAuth Identity 利用和 OmniAuth 相同的机制，很方便，但需要增加一个 Identity 表，而且和 User 表有重复。
这里有篇文章，介绍怎么把 Identity 放到 User model 里。
&lt;a href="http://bernardi.me/2012/09/using-multiple-omniauth-providers-with-omniauth-identity-on-the-main-user-model/" rel="nofollow" target="_blank"&gt;http://bernardi.me/2012/09/using-multiple-omniauth-providers-with-omniauth-identity-on-the-main-user-model/&lt;/a&gt;&lt;/p&gt;</description>
      <author>merlinran</author>
      <pubDate>Wed, 03 Apr 2013 15:12:08 +0800</pubDate>
      <link>https://ruby-china.org/topics/9945</link>
      <guid>https://ruby-china.org/topics/9945</guid>
    </item>
    <item>
      <title>重庆的有缘人，你在哪里？</title>
      <description>&lt;p&gt;IT 圈混了多年，也曾在牛 X 的团队里快乐地写着代码，无奈亲情难舍，故土难离，只得回来，舒服又无聊地干着硬件售后这份很有前途的工作。&lt;/p&gt;

&lt;p&gt;平淡的生活压制不住对创造的热爱，年初开始学习 RoR、Web 和 App 的一切。写过多年 C++/shell/SQL，就是没写过 Web。语言范型都是小菜，框架如毛恰似迷宫。不复当年的专注和坚忍。当奇奇怪怪的 BUG 挑战耐心，当目标遥远考验毅力，当日常琐事频生懈怠，便一溃千里。&lt;/p&gt;

&lt;p&gt;孤独疲惫的我，寻找同样热爱编程的你，我们结对吧。我相信社会化学习的强大力量。有的是点子、视野和经验，缺少的，是良好的氛围和持久的动力。星星之火，需要汇聚。&lt;/p&gt;

&lt;p&gt;来信吧，我等着你。merlinran@gmail.com&lt;/p&gt;</description>
      <author>merlinran</author>
      <pubDate>Thu, 11 Oct 2012 23:15:26 +0800</pubDate>
      <link>https://ruby-china.org/topics/6010</link>
      <guid>https://ruby-china.org/topics/6010</guid>
    </item>
    <item>
      <title>rspec-rails: 好端端的 Model 怎么成了 NilClass？</title>
      <description>&lt;p&gt;见了鬼了。&lt;a href="/contest" class="user-mention" title="@contest"&gt;&lt;i&gt;@&lt;/i&gt;contest&lt;/a&gt;明明有值，还 respond_to save，下一条里就成 NilClass 了。是我对 Ruby 的理解有误么？ &lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# coding: utf-8&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ContestsController&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;create&lt;/span&gt;
    &lt;span class="vi"&gt;@contest&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Contest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&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;:contest&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="s1"&gt;'@contest supports save'&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vi"&gt;@contest.respond_to&lt;/span&gt;&lt;span class="p"&gt;?(:&lt;/span&gt;&lt;span class="n"&gt;save&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vi"&gt;@contest.save&lt;/span&gt;
      &lt;span class="n"&gt;flash&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:notice&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'创建成功'&lt;/span&gt;
      &lt;span class="n"&gt;redirect_to&lt;/span&gt; &lt;span class="n"&gt;home_path&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;
      &lt;span class="n"&gt;flash&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:error&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'创建失败'&lt;/span&gt;
      &lt;span class="n"&gt;render&lt;/span&gt; &lt;span class="ss"&gt;:action&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="ss"&gt;:new&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;输出&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Running: spec/controllers/contests_controller_spec.rb spec/models/contest_spec.rb
F"@contest supports save"
F*F

Pending:
  ContestsController POST create redirects to add mission page
    # Not yet implemented
    # ./spec/controllers/contests_controller_spec.rb:16

Failures:

  1) ContestsController POST create creates a contest
     Failure/Error: post :create, contest: { 'name' =&amp;gt; contest.name }
     NoMethodError:
       undefined method `save' for nil:NilClass
     # ./app/controllers/contests_controller.rb:6:in `create'
     # ./spec/controllers/contests_controller_spec.rb:9:in `block (3 levels) in &amp;lt;top (required)&amp;gt;'
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;补上 spec&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;describe&lt;/span&gt; &lt;span class="no"&gt;ContestsController&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="n"&gt;let&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:my_contest&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="no"&gt;FactoryGirl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:contest&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="n"&gt;before&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:each&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;my_contest&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="n"&gt;describe&lt;/span&gt; &lt;span class="s1"&gt;'POST create'&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="s1"&gt;'creates a contest'&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
      &lt;span class="no"&gt;Contest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;should_receive&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:new&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;with&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;name: &lt;/span&gt;&lt;span class="n"&gt;my_contest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="n"&gt;post&lt;/span&gt; &lt;span class="ss"&gt;:create&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;contest: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="ss"&gt;name: &lt;/span&gt;&lt;span class="n"&gt;my_contest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;name&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
    &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="s1"&gt;'saves the contest'&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
      &lt;span class="no"&gt;Contest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:new&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;and_return&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;my_contest&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="n"&gt;my_contest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;should_receive&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:save&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="n"&gt;post&lt;/span&gt; &lt;span class="ss"&gt;:create&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
    &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="s1"&gt;'redirects to add mission page'&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>merlinran</author>
      <pubDate>Sat, 07 Jul 2012 12:44:23 +0800</pubDate>
      <link>https://ruby-china.org/topics/4177</link>
      <guid>https://ruby-china.org/topics/4177</guid>
    </item>
  </channel>
</rss>
