<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>birbird</title>
    <link>https://ruby-china.org/birbird</link>
    <description/>
    <language>en-us</language>
    <item>
      <title>Mongoid 里 order 和 sort 的区别是啥</title>
      <description>&lt;p&gt;Mongoid 既可以&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;Book&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="n"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;author: &lt;/span&gt;&lt;span class="s2"&gt;"Stephen King"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;order&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;created_at: :desc&lt;/span&gt;&lt;span class="p"&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="no"&gt;Book&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;author: &lt;/span&gt;&lt;span class="s2"&gt;"Stephen King"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="s2"&gt;"created_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;请问 order 和 sort 的区别是啥
谢啦先&lt;/p&gt;</description>
      <author>birbird</author>
      <pubDate>Sun, 05 Nov 2017 11:07:38 +0800</pubDate>
      <link>https://ruby-china.org/topics/34512</link>
      <guid>https://ruby-china.org/topics/34512</guid>
    </item>
    <item>
      <title>[已解决] 服务器各项资源都空闲但还是有请求拥塞</title>
      <description>&lt;p&gt;我这是个 ruby 小项目，就看成个代理吧，接受来自客户端（60 - 100 个）的请求，收到客户端请求后，去访问一些远端服务，得到数据，写数据库（Mongodb），再返回给客户端。有点特别的是，客户端会一个接一个不停地发请求。&lt;/p&gt;

&lt;p&gt;4 核 8 G 的机器，Passenger Standalone 部署，开了 24 个进程。
大部分时候服务还是工作的很好的，响应及时，Requests in queue 为 0。
但是，偶尔，不是经常，Requests in queue 里会有几十上百个请求，这时候服务器响应也很慢，十秒以上。
这时，从 passenger-status 看，进程有富余，不是所有进程都是满负荷工作。
从云主机控制台监控以及 top，free 看，各项资源（CPU，内存，带宽）都有富余，都没有用满。&lt;/p&gt;

&lt;p&gt;请问这该怎么查呢？
任何帮助，不甚感激！&lt;/p&gt;</description>
      <author>birbird</author>
      <pubDate>Sun, 25 Oct 2015 23:35:03 +0800</pubDate>
      <link>https://ruby-china.org/topics/27817</link>
      <guid>https://ruby-china.org/topics/27817</guid>
    </item>
    <item>
      <title>请问 Grape 怎么能返回不带引号的字符串</title>
      <description>&lt;p&gt;比如这样的接口，返回的是 "hello"，我不要引号，只要 hello，怎么能做到呢？
高人请指点，谢啦先！&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;params do
  ...
end
get do
  "hello"
end
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>birbird</author>
      <pubDate>Fri, 25 Sep 2015 23:27:52 +0800</pubDate>
      <link>https://ruby-china.org/topics/27484</link>
      <guid>https://ruby-china.org/topics/27484</guid>
    </item>
    <item>
      <title>请教更简洁的写法</title>
      <description>&lt;p&gt;我有一个方法，之前是这样的&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;def circles
  Circle.in(id: memberships.pluck(:circle_id))
end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;加了一个参数，做了个判断，就平白多了很多行，请问有没有更简洁的写法，谢啦先！&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;def circles(status)
  local_memberships = memberships
  if (status)
    local_memberships = local_memberships.where(status: status)
  end
  Circle.in(id: local_memberships.pluck(:circle_id))
end
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>birbird</author>
      <pubDate>Fri, 21 Aug 2015 17:28:11 +0800</pubDate>
      <link>https://ruby-china.org/topics/27023</link>
      <guid>https://ruby-china.org/topics/27023</guid>
    </item>
    <item>
      <title>如何只返回 belongs_to Model 的部分 field</title>
      <description>&lt;p&gt;每个 Speech 都有一个 author（类型 User），我希望 Speech 的 author 只包含 name 和 picture，而不要把 User 的所有 field 都返回了。
我想到的办法是用自定义 as_json，请问有没有别的办法？
代码如下&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class Speech
  include Mongoid::Document
  belongs_to :author, class_name: "User"

  def author_
    author.as_json(only: [:name, :picture])
  end
end

# 我用了 Grape Entity，但 Entity 上好像做不了精简 field 的事
present speeches, with: Entities::Topic
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>birbird</author>
      <pubDate>Thu, 13 Aug 2015 23:39:17 +0800</pubDate>
      <link>https://ruby-china.org/topics/26919</link>
      <guid>https://ruby-china.org/topics/26919</guid>
    </item>
    <item>
      <title>请问怎么能覆盖 Gem 里的方法</title>
      <description>&lt;p&gt;我想改变 Gem 的行为，需要重写 Gem 的一个方法，重写的方法需要用到原来的实现，改变其中的一部分。&lt;/p&gt;

&lt;p&gt;Gem 的代码&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="nn"&gt;CarrierWave&lt;/span&gt;
  &lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="nn"&gt;Mongoid&lt;/span&gt;
    &lt;span class="kp"&gt;include&lt;/span&gt; &lt;span class="no"&gt;CarrierWave&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Mount&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;mount_uploader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;uploader&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kp"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{},&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="n"&gt;field&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:mount_on&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;column&lt;/span&gt;

      &lt;span class="k"&gt;super&lt;/span&gt;

      &lt;span class="o"&gt;...&lt;/span&gt;

      &lt;span class="nb"&gt;class_eval&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;-&lt;/span&gt;&lt;span class="no"&gt;RUBY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kp"&gt;__FILE__&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kp"&gt;__LINE__&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="sh"&gt;
        # 我要重写的方法，
        def &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;=(new_file)
          column = _mounter(:&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;).serialization_column
          # mongoid won't upload a new file if there was no file previously.
          write_uploader(column, '_old_') if self.persisted? &amp;amp;&amp;amp; read_uploader(column).nil?
          send(:"&lt;/span&gt;&lt;span class="se"&gt;\#&lt;/span&gt;&lt;span class="sh"&gt;{column}_will_change!")
          super
        end

        ... 很多其他的方法，维持不变

&lt;/span&gt;&lt;span class="no"&gt;      RUBY&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;# Mongoid&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="c1"&gt;# CarrierWave&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="k"&gt;module&lt;/span&gt; &lt;span class="nn"&gt;CarrierWave&lt;/span&gt;
  &lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="nn"&gt;MongoidExtensions&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;mount_uploader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;uploader&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kp"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{},&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="k"&gt;super&lt;/span&gt;

      &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"New mount_uploader"&lt;/span&gt;
      &lt;span class="nb"&gt;class_eval&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;-&lt;/span&gt;&lt;span class="no"&gt;RUBY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kp"&gt;__FILE__&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kp"&gt;__LINE__&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="sh"&gt;
        def &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;=(cache_name)
          puts "重写了"
        end
&lt;/span&gt;&lt;span class="no"&gt;      RUBY&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;module&lt;/span&gt; &lt;span class="nn"&gt;Mongoid&lt;/span&gt;
    &lt;span class="n"&gt;prepend&lt;/span&gt; &lt;span class="no"&gt;MongoidExtensions&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;但我的代码看起来没起作用，给我的感觉是 prepend 的 mount_uploader 完全没有生效，因为 puts "New mount_uploader" 都没有出来。
请问应该怎么搞？
谢啦先！&lt;/p&gt;</description>
      <author>birbird</author>
      <pubDate>Sat, 08 Aug 2015 22:44:15 +0800</pubDate>
      <link>https://ruby-china.org/topics/26831</link>
      <guid>https://ruby-china.org/topics/26831</guid>
    </item>
    <item>
      <title>Devise 是怎么做到只输出部分字段的</title>
      <description>&lt;p&gt;我现在用 Grape + Mongoid + Devise。Devise 的 User Model 里有很多字段，在 API 输出的时候是不在响应里的（比如 encrypted_password, sign_in_count, last_sign_in_at）。我在 Devise 的代码里也没有找到自定义 to_json 的代码，请问 Devise 是怎么做到这一点的？&lt;/p&gt;

&lt;p&gt;我也有类似的需求，在输出的时候对 Model 做裁剪或者加一些东西。
我现在知道的方法有，用 grape-entity，或者自定义 to_json，或者用个写 json 的模板（如 jbuilder），直接在 model 实例上加属性也行（user[:xxx] = "yyy"）。
但 Devise 没有用上述的方法。那他是怎么做到的？&lt;/p&gt;</description>
      <author>birbird</author>
      <pubDate>Sat, 01 Aug 2015 15:36:36 +0800</pubDate>
      <link>https://ruby-china.org/topics/26730</link>
      <guid>https://ruby-china.org/topics/26730</guid>
    </item>
    <item>
      <title>动态生成 Class</title>
      <description>&lt;p&gt;我有一个 Module，里面有一些 Entity Class，另外还需要加一些 Entity Class 的变种，只是对原有的 Entity Class 做了一些变化，我想能运行时生成这些变种 Class，还是在这个 Module 里。
请问这个应该怎么搞，主要是&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;生成 Class 的代码应该写在什么地方&lt;/li&gt;
&lt;li&gt;怎么用代码来构造 Class&lt;/li&gt;
&lt;/ol&gt;</description>
      <author>birbird</author>
      <pubDate>Sat, 18 Jul 2015 17:51:01 +0800</pubDate>
      <link>https://ruby-china.org/topics/26553</link>
      <guid>https://ruby-china.org/topics/26553</guid>
    </item>
    <item>
      <title>Grape 的 before 没有 except 怎么解</title>
      <description>&lt;p&gt;API 需要鉴权，用 before，因为大部分 API 都需要鉴权，就写在根 API 文件上了，只用写一遍就好，简单。
但少数几个 API 又不需要鉴权，最理想的办法就像 rails 的 before_filter 一样，加个 except 就好了，但 Grape 的 before 没有 except。&lt;/p&gt;

&lt;p&gt;在需要鉴权的 API 文件上加 before，不需要鉴权的不加 before，可以解决，但太多重复了。
在 before 里判断 path，放过不需要鉴权的 API 也是个办法，还是觉得不优雅。&lt;/p&gt;

&lt;p&gt;请问有没有更好的办法？&lt;/p&gt;</description>
      <author>birbird</author>
      <pubDate>Fri, 17 Jul 2015 16:18:34 +0800</pubDate>
      <link>https://ruby-china.org/topics/26540</link>
      <guid>https://ruby-china.org/topics/26540</guid>
    </item>
    <item>
      <title>Grape 和 MongoId 一起用 ForbiddenAttributesError 的问题</title>
      <description>&lt;p&gt;我想直接把 json payload 整体存到 Mongodb 里。但碰到了 ActiveModel::ForbiddenAttributesError。代码是这样的&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="nb"&gt;format&lt;/span&gt; &lt;span class="ss"&gt;:json&lt;/span&gt;
&lt;span class="n"&gt;params&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="n"&gt;requires&lt;/span&gt; &lt;span class="ss"&gt;:user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;type: &lt;/span&gt;&lt;span class="no"&gt;Hash&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="n"&gt;requires&lt;/span&gt; &lt;span class="ss"&gt;:name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;type: &lt;/span&gt;&lt;span class="no"&gt;String&lt;/span&gt;
    &lt;span class="n"&gt;requires&lt;/span&gt; &lt;span class="ss"&gt;:password&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;type: &lt;/span&gt;&lt;span class="no"&gt;String&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;post&lt;/span&gt; &lt;span class="ss"&gt;:signup&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="nb"&gt;puts&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;:user&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="no"&gt;User&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="n"&gt;params&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="k"&gt;end&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="nb"&gt;format&lt;/span&gt; &lt;span class="ss"&gt;:json&lt;/span&gt;
&lt;span class="n"&gt;params&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="n"&gt;requires&lt;/span&gt; &lt;span class="ss"&gt;:user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;type: &lt;/span&gt;&lt;span class="no"&gt;Hash&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="n"&gt;requires&lt;/span&gt; &lt;span class="ss"&gt;:name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;type: &lt;/span&gt;&lt;span class="no"&gt;String&lt;/span&gt;
    &lt;span class="n"&gt;requires&lt;/span&gt; &lt;span class="ss"&gt;:password&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;type: &lt;/span&gt;&lt;span class="no"&gt;String&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;post&lt;/span&gt; &lt;span class="ss"&gt;:signup&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="nb"&gt;puts&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;:user&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="no"&gt;User&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;name: &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;:user&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="ss"&gt;:name&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="ss"&gt;password: &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;:user&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="ss"&gt;:password&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;请问前面那个写法错在哪儿了？&lt;/p&gt;</description>
      <author>birbird</author>
      <pubDate>Sun, 12 Jul 2015 14:38:00 +0800</pubDate>
      <link>https://ruby-china.org/topics/26451</link>
      <guid>https://ruby-china.org/topics/26451</guid>
    </item>
    <item>
      <title>Rails 有什么好的生成 API Doc 的工具么</title>
      <description>&lt;p&gt;找了一下，发现了这么几个，但都不满意
&lt;a href="https://github.com/zipmark/rspec_api_documentation" rel="nofollow" target="_blank"&gt;https://github.com/zipmark/rspec_api_documentation&lt;/a&gt;
&lt;a href="https://github.com/Apipie/apipie-rails" rel="nofollow" target="_blank"&gt;https://github.com/Apipie/apipie-rails&lt;/a&gt;
&lt;a href="https://github.com/richhollis/swagger-docs" rel="nofollow" target="_blank"&gt;https://github.com/richhollis/swagger-docs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;关键在如何生成 Response 的 Doc，最好是能从 jbuilder（或者产生 Response json 的代码上）生成 API Doc，而不要硬贴一个 Response example 上去，那样日后维护起来容易错。&lt;/p&gt;

&lt;p&gt;请问有这样的工具么？&lt;/p&gt;</description>
      <author>birbird</author>
      <pubDate>Wed, 24 Jun 2015 13:31:41 +0800</pubDate>
      <link>https://ruby-china.org/topics/26155</link>
      <guid>https://ruby-china.org/topics/26155</guid>
    </item>
    <item>
      <title>请问 rails + memcached 乱码的问题</title>
      <description>&lt;p&gt;用的是 dalli，存 cache 是这么写的
Rails.cache.write(request.fullpath, response.body)&lt;/p&gt;

&lt;p&gt;存进去取出来就多了一些乱七八糟的字符，好像这样
I"{"version":20141120}:ET&lt;/p&gt;

&lt;p&gt;有人提供解决方案，但我用了这办法也不对
&lt;a href="http://stackoverflow.com/questions/13955160/set-raw-value-with-rails-cache-write" rel="nofollow" target="_blank"&gt;http://stackoverflow.com/questions/13955160/set-raw-value-with-rails-cache-write&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;请问有更好的办法么？&lt;/p&gt;</description>
      <author>birbird</author>
      <pubDate>Mon, 08 Dec 2014 22:20:29 +0800</pubDate>
      <link>https://ruby-china.org/topics/23089</link>
      <guid>https://ruby-china.org/topics/23089</guid>
    </item>
    <item>
      <title>请问如何禁止以 query string 的形式访问接口</title>
      <description>&lt;p&gt;有一个接口，比如
/notices/:id，其实写成
/notices?id=1，也是能正确访问的&lt;/p&gt;

&lt;p&gt;有没有办法，强制必须写成 /notices/:id，不允许以 /notices?id=1 这种形式访问？&lt;/p&gt;

&lt;p&gt;谢了先！&lt;/p&gt;</description>
      <author>birbird</author>
      <pubDate>Fri, 05 Dec 2014 17:02:56 +0800</pubDate>
      <link>https://ruby-china.org/topics/23048</link>
      <guid>https://ruby-china.org/topics/23048</guid>
    </item>
    <item>
      <title>请问怎么把 Hash 通过 jbuilder 变成 json</title>
      <description>&lt;p&gt;我有一个 Hash，这个样子的&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;B&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;Position&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;B1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt;
              &lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;Position&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;B2&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;C&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;Position&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;C1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt;
              &lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;Position&lt;/span&gt; &lt;span class="nx"&gt;id&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;span class="nx"&gt;name&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;C2&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;其中 Position 是我自己定义的类。
期望把他输出成这样的 json&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;positions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;B&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;B1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;B2&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="na"&gt;C&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;C1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&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;span class="na"&gt;name&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;C2&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;],&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;p&gt;我是这么干的，
json.set! :positions, &lt;a href="/place.positions_" class="user-mention" title="@place.positions_"&gt;&lt;i&gt;@&lt;/i&gt;place.positions_&lt;/a&gt;
但是不行，说 undefined method `key?' for #&lt;a rel="nofollow" target="_blank"&gt;JSON::Ext::Generator::State:0x5a2f070&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;请问这个该怎么搞啊？
谢啦先！&lt;/p&gt;</description>
      <author>birbird</author>
      <pubDate>Wed, 06 Aug 2014 23:15:06 +0800</pubDate>
      <link>https://ruby-china.org/topics/20880</link>
      <guid>https://ruby-china.org/topics/20880</guid>
    </item>
    <item>
      <title>请问怎么往 ActiveModel 的 json 里加 hash 或者 array</title>
      <description>&lt;p&gt;我有一个类 class Place &amp;lt; ActiveRecord::Base，之前已经写好了输出成 json 的规则，这个样子的&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;as_json_options&lt;/span&gt;
  &lt;span class="vi"&gt;@options&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;
  &lt;span class="vi"&gt;@options&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:except&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:created_at&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:updated_at&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="vi"&gt;@options&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:include&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:positions&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;Position&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;as_json_options&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="vi"&gt;@options&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:methods&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:guide_info&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;其中的 Position 是一个这样的东西&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;name&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;A1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;tags&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;abc&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;xyz&lt;/span&gt;&lt;span class="dl"&gt;"&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;p&gt;原来 Place 里包含一个 Position 数组，都是通过 ActiveRecord 映射好的，输出 json 也很正常。
现在需求变了，要求 Place.positions 不是一个数组了，是一个根据 position name 首字母分组的 Hash，类似这样&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;
    &lt;span class="nx"&gt;positions_&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nl"&gt;A&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;A1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;tags&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;abc&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;xyz&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;A2&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;tags&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;abc&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;xyz&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="p"&gt;...&lt;/span&gt;
        &lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="nx"&gt;B&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;B1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;tags&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;abc&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;xyz&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;B2&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;tags&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;abc&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;xyz&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="p"&gt;...&lt;/span&gt;
        &lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="p"&gt;...&lt;/span&gt;
    &lt;span class="p"&gt;},&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;p&gt;我倒是可以按上述结构构造一个 hash 属性，但我没有办法把这个 hash 按照 as_json 的方式放到输出里，因为他不是 ActiveModel，会报 undefined method `serializable_hash' for #&lt;a rel="nofollow" target="_blank"&gt;Hash:0x54a4610&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;我能做到的就是把这个 hash.to_json 当字符串用 &lt;a href="/options" class="user-mention" title="@options"&gt;&lt;i&gt;@&lt;/i&gt;options&lt;/a&gt;[:methods] 挂在 json 的一个字段上，但这样 positions_ 里就会有一些不必要的引号，因为 to_json 的时候就带了引号。这样不好。&lt;/p&gt;

&lt;p&gt;请问，这该怎么搞？
谢啦先！&lt;/p&gt;</description>
      <author>birbird</author>
      <pubDate>Tue, 05 Aug 2014 22:49:30 +0800</pubDate>
      <link>https://ruby-china.org/topics/20860</link>
      <guid>https://ruby-china.org/topics/20860</guid>
    </item>
    <item>
      <title>请问怎么让命令行里的日志有颜色</title>
      <description>&lt;p&gt;Windows 上，rails s 以后，日志没有颜色，有这种古怪的符号 ←[1m←  ←[0m 在需要着色的字符两边
在另一台 Windows 机器上就是有颜色的，请问这个是咋回事呢&lt;/p&gt;</description>
      <author>birbird</author>
      <pubDate>Fri, 25 Oct 2013 13:47:26 +0800</pubDate>
      <link>https://ruby-china.org/topics/15023</link>
      <guid>https://ruby-china.org/topics/15023</guid>
    </item>
    <item>
      <title>Unpermitted parameters: topic_ids</title>
      <description>&lt;p&gt;我有一个多对多关系 Explaination 和 Topic，创建 Explaination 绑定若干 Topics，其他的都对了，就是这个关联一直绑不上，日志说 Unpermitted parameters: topic_ids，请问这是啥情况，知道请指点，谢啦先！&lt;/p&gt;

&lt;p&gt;我的 Controller 是这样写的&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;create&lt;/span&gt;
  &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;permit!&lt;/span&gt;
  &lt;span class="vi"&gt;@place&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Place&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;:place_id&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
  &lt;span class="vi"&gt;@explaination&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="vi"&gt;@place.explainations.create&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;:explaination&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;permit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:speaker&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:speaker_title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:like&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:topic_ids&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
  &lt;span class="vi"&gt;@explaination.save&lt;/span&gt;

  &lt;span class="n"&gt;redirect_to&lt;/span&gt; &lt;span class="vi"&gt;@place&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 ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Explaination&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;Base&lt;/span&gt;
  &lt;span class="n"&gt;belongs_to&lt;/span&gt; &lt;span class="ss"&gt;:place&lt;/span&gt;
  &lt;span class="n"&gt;has_many&lt;/span&gt; &lt;span class="ss"&gt;:explaination_segments&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:dependent&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="ss"&gt;:destroy&lt;/span&gt;
  &lt;span class="n"&gt;has_and_belongs_to_many&lt;/span&gt; &lt;span class="ss"&gt;:topics&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;segments&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;explaination_segments&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;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Topic&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;Base&lt;/span&gt;
  &lt;span class="n"&gt;belongs_to&lt;/span&gt; &lt;span class="ss"&gt;:place&lt;/span&gt;
  &lt;span class="n"&gt;has_and_belongs_to_many&lt;/span&gt; &lt;span class="ss"&gt;:explainations&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="n"&gt;create_table&lt;/span&gt; &lt;span class="s2"&gt;"explainations_topics"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;force: &lt;/span&gt;&lt;span class="kp"&gt;true&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;t&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
  &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;integer&lt;/span&gt;  &lt;span class="s2"&gt;"explaination_id"&lt;/span&gt;
  &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;integer&lt;/span&gt;  &lt;span class="s2"&gt;"topic_id"&lt;/span&gt;
  &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;datetime&lt;/span&gt; &lt;span class="s2"&gt;"created_at"&lt;/span&gt;
  &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;datetime&lt;/span&gt; &lt;span class="s2"&gt;"updated_at"&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>birbird</author>
      <pubDate>Fri, 25 Oct 2013 12:46:18 +0800</pubDate>
      <link>https://ruby-china.org/topics/15019</link>
      <guid>https://ruby-china.org/topics/15019</guid>
    </item>
    <item>
      <title>碰上了 undefined method `read_inheritable_attribute' for Record:Class</title>
      <description>&lt;p&gt;用 MongoMapper 连 MongoDB，不继承 ActiveRecord 了，&lt;/p&gt;

&lt;p&gt;Model 类是这样的，&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;Record&lt;/span&gt;
  &lt;span class="kp"&gt;include&lt;/span&gt; &lt;span class="no"&gt;MongoMapper&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Document&lt;/span&gt;

  &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="ss"&gt;:order_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;String&lt;/span&gt;
  &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="ss"&gt;:pnr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="no"&gt;Integer&lt;/span&gt;

&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在 Controller 里 new 的时候就报了 undefined method `read_inheritable_attribute' for Record:Class&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;new&lt;/span&gt;
  &lt;span class="vi"&gt;@record&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Record&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这是咋回事啊，谢啦先！&lt;/p&gt;</description>
      <author>birbird</author>
      <pubDate>Thu, 26 Sep 2013 18:21:27 +0800</pubDate>
      <link>https://ruby-china.org/topics/14410</link>
      <guid>https://ruby-china.org/topics/14410</guid>
    </item>
    <item>
      <title>阿里云上的 rails server 过一会就关闭了</title>
      <description>&lt;p&gt;网站放在阿里云上，每隔几个小时就不能访问了，ssh 过去一看，WEBrick 进程已经不存在了，重新 rails server 就好了，但管不了几个小时又挂了。这是啥情况啊，知道请指点，谢啦先！&lt;/p&gt;</description>
      <author>birbird</author>
      <pubDate>Sun, 22 Sep 2013 12:29:53 +0800</pubDate>
      <link>https://ruby-china.org/topics/14275</link>
      <guid>https://ruby-china.org/topics/14275</guid>
    </item>
    <item>
      <title>嵌套结构的 as_json 只有第一层工作</title>
      <description>&lt;p&gt;我的 Model 有三层，从上到下是 Place，Guide，Story&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;Place&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;Base&lt;/span&gt;
  &lt;span class="n"&gt;has_many&lt;/span&gt; &lt;span class="ss"&gt;:guides&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:dependent&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="ss"&gt;:destroy&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;as_json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{})&lt;/span&gt;
    &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:except&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:created_at&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:updated_at&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:include&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:guides&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;options&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;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Guide&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;Base&lt;/span&gt;
  &lt;span class="n"&gt;belongs_to&lt;/span&gt; &lt;span class="ss"&gt;:place&lt;/span&gt;
  &lt;span class="n"&gt;has_many&lt;/span&gt; &lt;span class="ss"&gt;:stories&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:dependent&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="ss"&gt;:destroy&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;as_json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{})&lt;/span&gt;
    &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:except&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:created_at&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:updated_at&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:include&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:stories&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;options&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;如果 render :json =&amp;gt; &lt;a href="/places" class="user-mention" title="@places"&gt;&lt;i&gt;@&lt;/i&gt;places&lt;/a&gt; 的话，只有第一层，即 Place.as_json 生效，Guide.as_json 根本不会被调用。
这咋办啊，知道请指点，谢了先！&lt;/p&gt;</description>
      <author>birbird</author>
      <pubDate>Fri, 20 Sep 2013 11:24:20 +0800</pubDate>
      <link>https://ruby-china.org/topics/14243</link>
      <guid>https://ruby-china.org/topics/14243</guid>
    </item>
  </channel>
</rss>
