<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>nyrf</title>
    <link>https://ruby-china.org/nyrf</link>
    <description/>
    <language>en-us</language>
    <item>
      <title>Alpha preview: Modern JavaScript in Rails 7 without Webpack</title>
      <description>&lt;p&gt;看 dhh 发了个视频，感觉还挺有意思，不过我个人现在习惯了 vite&lt;/p&gt;

&lt;p&gt;&lt;span class="embed-responsive embed-responsive-16by9"&gt;&lt;iframe class="embed-responsive-item" src="//www.youtube.com/embed/PtxZvFnL2i0" allowfullscreen=""&gt;&lt;/iframe&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <author>nyrf</author>
      <pubDate>Tue, 17 Aug 2021 22:00:08 +0800</pubDate>
      <link>https://ruby-china.org/topics/41587</link>
      <guid>https://ruby-china.org/topics/41587</guid>
    </item>
    <item>
      <title>DHH 说的 new magic 好像发布了</title>
      <description>&lt;p&gt;刚在 twitter 上看 dhh 发的，&lt;a href="https://hotwire.dev/" rel="nofollow" target="_blank"&gt;https://hotwire.dev/&lt;/a&gt;  &lt;a href="https://github.com/hotwired" rel="nofollow" target="_blank"&gt;https://github.com/hotwired&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;又发了个视频&lt;span class="embed-responsive embed-responsive-16by9"&gt;&lt;iframe class="embed-responsive-item" src="//www.youtube.com/embed/eKY-QES1XQQ" allowfullscreen=""&gt;&lt;/iframe&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <author>nyrf</author>
      <pubDate>Wed, 23 Dec 2020 00:49:28 +0800</pubDate>
      <link>https://ruby-china.org/topics/40731</link>
      <guid>https://ruby-china.org/topics/40731</guid>
    </item>
    <item>
      <title>ActionText 使用的 Trix 有没有办法 I18n</title>
      <description>&lt;p&gt;本来想试下 actiontext, 结果发现 trix 这玩意是真的不怎么好用，而且 toolbar 还没法 i18n，虽然 wiki 里有写，&lt;a href="https://github.com/basecamp/trix/wiki/I18n" rel="nofollow" target="_blank"&gt;https://github.com/basecamp/trix/wiki/I18n&lt;/a&gt; , 结果发现没用。&lt;/p&gt;</description>
      <author>nyrf</author>
      <pubDate>Tue, 19 Nov 2019 16:18:34 +0800</pubDate>
      <link>https://ruby-china.org/topics/39262</link>
      <guid>https://ruby-china.org/topics/39262</guid>
    </item>
    <item>
      <title>Rails 6.0.0 beta1 发布</title>
      <description>&lt;p&gt;主要更新包括：&lt;/p&gt;

&lt;p&gt;1、&lt;a href="https://weblog.rubyonrails.org/2018/12/13/introducing-action-mailbox-for-rails-6/" rel="nofollow" target="_blank" title=""&gt;Action Mailbox&lt;/a&gt; 集成&lt;/p&gt;

&lt;p&gt;2、&lt;a href="https://weblog.rubyonrails.org/2018/10/3/introducing-action-text-for-rails-6/" rel="nofollow" target="_blank" title=""&gt;Action Text&lt;/a&gt; 以 Trix editor 为基础的富文本编辑器&lt;/p&gt;

&lt;p&gt;3、&lt;a href="https://github.com/rails/rails/pull/34052" rel="nofollow" target="_blank" title=""&gt;new multiple database support &lt;/a&gt; 多数据库支持&lt;/p&gt;

&lt;p&gt;4、&lt;a href="https://github.com/rails/rails/pull/31900" rel="nofollow" target="_blank" title=""&gt;parallel testing support&lt;/a&gt; 并行测试&lt;/p&gt;

&lt;p&gt;5、Webpacker 现在默认做为 js 的打包工具，不过还是用 Sprockets 进行图片和 css 的处理&lt;/p&gt;

&lt;p&gt;6、其它一些比如：&lt;a href="https://github.com/rails/rails/pull/33659#issue-209385961" rel="nofollow" target="_blank" title=""&gt;Action cable testing&lt;/a&gt;, Action Cable JavaScript 使用 es6 重写等&lt;/p&gt;

&lt;p&gt;7、Rails 6.0 要求 Ruby 2.5.0+&lt;/p&gt;

&lt;p&gt;更多详细的可以看&lt;a href="https://github.com/rails/rails/tree/v6.0.0.beta1" rel="nofollow" target="_blank" title=""&gt;CHANGELOG&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;其中有几个对我自己有帮助的更新：&lt;/p&gt;

&lt;p&gt;1、Active Storage 如下代码&lt;code&gt;@user.avatar = params[:avatar]&lt;/code&gt;，现在只有在&lt;a href="/user" class="user-mention" title="@user"&gt;&lt;i&gt;@&lt;/i&gt;user&lt;/a&gt;保存成功后才会保存图片。&lt;/p&gt;

&lt;p&gt;2、添加了一个&lt;code&gt;implicit_order_column&lt;/code&gt;, 在我们使用 Model.first 或者 Model.last 时，是以主键做为排序的，不过如果主键是 uuid 等，可能得不到我们想要的结果，有了这个可以加上如下代码&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;Project&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="nb"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;implicit_order_column&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"created_at"&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;3、&lt;code&gt;has_secure_password&lt;/code&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;User&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_secure_password&lt;/span&gt; &lt;span class="ss"&gt;:recovery_password&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;validations: &lt;/span&gt;&lt;span class="kp"&gt;false&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&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;new&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;recovery_password&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"42password"&lt;/span&gt;
&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;recovery_password_digest&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; "$2a$04$iOfhwahFymCs5weB3BNH/uX..."&lt;/span&gt;
&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;authenticate_recovery_password&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'42password'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; user&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;4、&lt;code&gt;delegate&lt;/code&gt;添加了&lt;code&gt;private&lt;/code&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;User&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_one&lt;/span&gt; &lt;span class="ss"&gt;:profile&lt;/span&gt;
  &lt;span class="n"&gt;delegate&lt;/span&gt; &lt;span class="ss"&gt;:date_of_birth&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;to: :profile&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;private: &lt;/span&gt;&lt;span class="kp"&gt;true&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;age&lt;/span&gt;
    &lt;span class="no"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;today&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;year&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;date_of_birth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;year&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;# User.new.age  # =&amp;gt; 29&lt;/span&gt;
&lt;span class="c1"&gt;# User.new.date_of_birth&lt;/span&gt;
&lt;span class="c1"&gt;# =&amp;gt; NoMethodError: private method `date_of_birth' called for #&amp;lt;User:0x00000008221340&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;5、&lt;code&gt;create_table&lt;/code&gt;添加了&lt;code&gt;:if_not_exists&lt;/code&gt;选项&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;create_table :posts, if_not_exists: true do |t|
  t.string :title
end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;6、添加了&lt;code&gt;Relation#pick&lt;/code&gt;,
以前这么写&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;Post&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;category: &lt;/span&gt;&lt;span class="s2"&gt;"Rails 6"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;limit&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="nf"&gt;pluck&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="nf"&gt;first&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;现在可以&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;Post&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;category: &lt;/span&gt;&lt;span class="s2"&gt;"Rails 6"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;pick&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;/code&gt;&lt;/pre&gt;
&lt;p&gt;7、多数据库支持，我平时没怎么用到，看了下，主要有两个 api &lt;/p&gt;

&lt;p&gt;(1) &lt;code&gt;connects_to&lt;/code&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;AnimalsModel&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;ApplicationRecord&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;abstract_class&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt;

  &lt;span class="n"&gt;connects_to&lt;/span&gt; &lt;span class="ss"&gt;database: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="ss"&gt;writing: :animals_primary&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;reading: :animals_replica&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;class&lt;/span&gt; &lt;span class="nc"&gt;Dog&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;AnimalsModel&lt;/span&gt;
  &lt;span class="c1"&gt;# connected to both the animals_primary db for writing and the animals_replica for reading&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;(2) &lt;code&gt;ActiveRecord::Base.connected_to&lt;/code&gt;方法，可以使用&lt;code&gt;role&lt;/code&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;Book&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;ApplicationRecord&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="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="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connected_to&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;role: :reading&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="no"&gt;Dog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;first&lt;/span&gt; &lt;span class="c1"&gt;# 在AnimalsModel中定义了`reading: animals_replica`，可查找记录&lt;/span&gt;
  &lt;span class="no"&gt;Book&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;first&lt;/span&gt; &lt;span class="c1"&gt;# 没有定义reading，报错&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;也可以使用&lt;code&gt;database&lt;/code&gt;连接在&lt;code&gt;database.yml&lt;/code&gt;中定义过的数据库&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&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="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connected_to&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;database: :slow_replica&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="no"&gt;SlowReplicaModel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;first&lt;/span&gt; &lt;span class="c1"&gt;#如果在`database.yml`中定义了`slow_replica`数据库，那可以查找，否则报错&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;不过&lt;code&gt;ActiveRecord::Base.connected_to&lt;/code&gt;可以接受 hash 或者 url configs，&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;User&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connected_to&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;database: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="ss"&gt;writing: &lt;/span&gt;&lt;span class="s2"&gt;"postgres://foo"&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="k"&gt;do&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="s2"&gt;"Gannon"&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;config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;"adapter"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"sqlite3"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"database"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"db/readonly.sqlite3"&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;connected_to&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;database: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="ss"&gt;reading: &lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="k"&gt;do&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;count&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>nyrf</author>
      <pubDate>Sat, 19 Jan 2019 09:11:01 +0800</pubDate>
      <link>https://ruby-china.org/topics/38020</link>
      <guid>https://ruby-china.org/topics/38020</guid>
    </item>
  </channel>
</rss>
