週刊Railsウォッチ(20170428)Rails 6.xでの’#form_for’と`#form_tag`廃止決定のその後、deviseの5.1対応はこれから、ほか

こんにちは、hachi8833です。Mastodonの毀誉褒貶がジェットコースターみたいに上下しているのでしばらく静観することにします。

今回はcloseしたコミットを中心に取り上げました。来週はGWでお休みなので、今回はいつもより多めの増刊号です。

「Rails 6.xでの#form_for#form_tag廃止」その後

ちゃんとお伝えしてなかったのですが、DHHは既に#25197で、皆さまの思い出がいっぱいいっぱい詰まったあの#form_for#form_tag6.xで廃止するだろうと宣言しています。

Note: For 5.x, form_for and form_tag should just be soft deprecations, no warnings. Then we can deprecate with a warning, perhaps, in Rails 6.x.
#25197より

それに呼応した動きが早くも出始めています。

rails-bootstrap-formsでは#bootstrap_form_withというメソッド名にしようかなんて話もあがっています。

BootstrapならTwitter公式のbootstrap-sassの方にしたいです。

参考

Rails 5.1のルーティング新機能#resolveって何?

もともとRails 5.1 rc2公開のトピックを準備していたのですが、本日既に「【速報】Rails 5.1が正式リリースされました!」でお伝えしたとおり5.1が正式にリリースされたので差し替えました。

一週間というはかない命だったRails 5.1rc2の記事を一同でチェックしていて、5.1のルーティングの新機能であるdirectはともかく、resolveの方がAPIドキュメントだけだとどうにもわかりにくいという話題になりました。

polymorphicなルーティングは前からあったようですが、その挙動をカスタマイズできるようになったということなのでしょうか。

resolveについては追いきれなかったので別記事にしたいと思います。

DeviseのRails 5.1対応はこれから

Railsの定番認証ライブラリであるDeviseでも、「5.1で動かないYO!」との声が届き始めています。

メジャー/マイナーアップデートでgemが続々とアップデートを迫られる光景はもうおなじみかと思いますが、5.1を実務に投入するのはこの辺が落ち着いてからがよさそうですね。

Rails: ActionController::Parameters#to_query#to_paramを実装

#to_query('user')は、上で言うとuser[name]=David&user[nationality]=Danishみたいにしてくれるのか」「#redirect_toでmodel objectをそのまま引き渡したいときに便利そう」という声がありました。

そこから「モデルを元にURLを組み立てると長くなりすぎないかな?」「そもそもURLって最大何文字まで許されるんだろうか?」という話題に発展し、morimorihogeさんがStackOverflowのものすごく詳細な回答を見つけてくれました。

Browser     Address bar   document.location  
                          or anchor tag
------------------------------------------
Chrome          32779           >64k      
Android          8192           >64k                         
Firefox          >64k           >64k      
Safari           >64k           >64k     

document.locationやアンカータグを使うと64kまでOKだそうです。「これって何かの脆弱性なんじゃない?」という声もありました。今回初参加のakioさんがその場で検証コードを書いてくれました。

# URLの後ろについたパラメータに対してパラメータを追加するには?
require "active_support/all"
require "rack"

url = "http://www.google.co.jp/?a=1&b=2"
uri = URI(url)

query_hash = Rack::Utils.parse_nested_query(uri.query) # => {"a"=>"1", "b"=>"2"}

uri.query = query_hash.merge(:c => 3).to_query # => "a=1&b=2&c=3"
uri.normalize.to_s                             # => "http://www.google.co.jp/?a=1&b=2&c=3"

さらに「この#normalizeってどのライブラリのが使われるんだろう?」という話題になりました。同名のメソッドがいくつもあったりしてRubyMineでもなかなか見つかりませんでしたが、最終的にRuby本家のlib/rubygems/uri_formatter.rbだったことがわかりました。勉強になります。

Rails: 不要なnilチェックを削除

これはもう見たまんまですね。

return if new_attributes.nil? || new_attributes.empty?
# ↓
return if new_attributes.empty?

Rails: before_saveコールバックが2回呼ばれるバグを修正

特定の条件でコールバックが2回呼ばれることがあるというやっかいなバグをkamipoさんが果敢に修正しています。以下の多くのRailsバグ修正も大半がkamipoさんです。

Rails: ClassSpecificRelationmethod_missingが先に呼ばれてしまうバグ

Kernel#respond_to_missing?はRubyのメタプログラミング系メソッドですが、「こんなメソッドあったんか」「こういうときに必要だねー」「Ruby Gold試験のいやらしい問題で出てきそうだナ」といった声がありました。

Rails: respond_to_missing?がpublicになっていたのを修正

修正箇所は以下です。

もうドラクエ中盤のごとくバッタバッタとなぎ倒しています。「日刊kamipoさん」とお呼びしたいです。

Rails: secrets.yaml読み込み時のsymbolize_keysdeep_symbolize_keysに変更

yamlのシンボル化が再帰的でなかったというバグです。再びakioさんがその場で検証コードを書いてくれました。

require "active_support/all"
params = {"a" => {"b" => {"c" => {"d" => 0}}}}

params.symbolize_keys          # => {:a=>{"b"=>{"c"=>{"d"=>0}}}}
params.deep_symbolize_keys     # => {:a=>{:b=>{:c=>{:d=>0}}}}

Rails: レコードが作成済みでも再作成されてしまうバグを修正

条件やタイミングによって起きるバグは厄介ですね。そこから、capistranoなどのデプロイツールの排他制御が案外甘いよねといった話題になりました。一度に1人しか使わないことが暗黙の前提になってたりするそうです。「stagingとproductionに別々のコンソールから同時にデプロイかけたら両方死んだことありましたね」という発言も飛び出しました。

Rails: 文章の修正など


https://github.com/rails/rails/commit/54fa07f2c87a7aad9a17539e409497e46d2607cdより

これも立派なコミットです。実際、コメントの英文とかって走り書きが多くて、フレーズ同士の接続もときどき怪しかったりするんですよね。一次資料であるAPIドキュメントの文章がユルユルだと本当に困ってしまいますので、こういう修正は助かります。

「英語圏の人なら誰でも隙のない完璧な英語を書ける」なんてことはまったくありませんのでご安心ください。技術英文はむしろこういうことに寛大で、少々言い回しが稚拙なぐらいであればたいてい黙って許容してくれますが、逆に言い回しについてはよほどひどくないとなかなかツッコんでくれません。

コードと同様、英文作成の上達にもレビューやマサカリが必要なんですけどね。

Ruby: Array#to_sの実装が重複していたのを削除

ここからはRubyのissueです。
エイリアス化されているので一方は不要だったそうです。

Ruby: Range#countRange#sizeのエイリアスにしたい(却下)

Issueはそのまんまですが、#size#countの挙動の違いについて一同で追いました。morimorihogeさんがその場で試すと#countで見事に固まりました。

(1..Float::INFINITY).count  #=> フリーズ

(1..Float::INFINITY).size   #=> Infinity

両者の違いは、律儀に列挙するか、遅延処理するかという違いのようです。
範囲演算子の一方がFloat::INFINITYというシチュエーションはビジネスユースではまずないとは思いますが、挙動については知っておいて損はないと思います。

Ruby: Windows環境でEncoding.default_externalのデフォルトをUTF-8にしたい(却下)

「確かに必要だが、Ruby 2.5では行う予定がない」とのことです。Windows + Rubyはいろいろ大変そうです。

Ruby: Complex/Rational/Timeのパフォーマンスが向上

いずれもわずかですがベンチマークがよくなっています。複素数や有理数ですが。

Rubyが2回インストールされたバグ

double rainbowは虹が二重になる珍しい現象ですが、ジーンとくる的な意味にも使われたりします。「Double Rainbow」という曲もいくつもあるようです。

Double Rainbow Wide Desktop Background

初めてのRailsアプリを確実にデプロイするための心得(RubyFlowより)

初心者がやるべきこと

  • 「よいソフトウェアとは何か」を今一度自問自答する
  • scaffoldをためらわずに使う
  • feature Specをちゃんと書く
  • 自分の技術が未熟なことをくよくよ悩まない
  • パレートの法則を胸に刻みこむ
  • 将来改修が行われることをユーザーにしっかり理解してもらう

初心者に避けて欲しいこと

  • モデルでコールバックを使うこと
  • 何でもかんでもコントローラでやろうとすること

表現力豊かなRSpecテスト(part 1)テストを正しく書くには(RubyFlowより)

「これはpart 2が出てからでいいかなー」という声がありました。

SaaSで測定すべき3つの要素と改善方法

  1. 顧客を得るコスト
  2. 顧客が使ってくれる期間
  3. 1か月あたりに離れた顧客の数(churn)

Railsで検索とオートコンプリートを実装する

比較的長い記事ですが、ほとんどが手順なのですっと読めると思います。

Railsでのautocompleteということもあり、Ajaxやサーバ側のJSONインターフェース作成もあるので「初級者向けの練習にはいいんじゃね?」「実務で役に立つわこれ」という声がありました。

Railsチュートリアルを終えた後にやることが見つからない方におすすめです。

PDF書籍: Fearless Refactoring: Rails controllers

49ドルです。サイトを開くと、before_filterで汚れまくったコントローラのコードがババーンと登場。


Fearless Refactoring: Rails controllersより

コントローラのリファクタリングに興味のある方向け。

Rubyの弾力性: エラーハンドリング(Ruby Weeklyより)

元GitHubの中の人が、エラー処理を初歩から丁寧に解説しています。エラー処理に関心のある方向け。

この頃流行りのWebデザイン5種(2017年)

今はこんな感じだそうです。

  • Serifフォント
  • ナチュラルカラーパレット
  • メガナビゲーション(Meganavi)
  • オーバーラッピングコンテンツ
  • グラデーション(また?)


www.sitepoint.comより

Webデザインはアパレル業界と違って、誰かが裏で手を回して流行をコントロールするみたいなことはやりにくそうですね。「フォントってWebデザインだっけ?」という声も。

Zen Railsセキュリティチェックリスト(Ruby Weeklyより)

ankane/secure_railsも同種のチェックリストですが、Zenの方が星は多いですね。

「もうこういうチェックリストより自動チェックの方が重要!」「そこでbrakemanですよ」という意見がありました。

jemallocでRubyアプリのメモリ使用量とパフォーマンスを改善(Ruby Weeklyより)

Heroku上のアプリで、デバッガ的なライブラリをレイヤにはさんでパフォーマンスをチューニングしている感じです。「jで始まるとどうもJavaがらみに見えちゃうよね」という声も。

番外: パーキンソン病は腸から迷走神経を伝って脳に転移する可能性

迷走神経(vagus nerve)を切除した人はパーキンソン病の発生率が低かったそうです。医学英語はラテン語が多いうえにドイツ語っぽい合成語も多くてむずいです。

そういえば人間の神経系のうち、脊髄を中心とする神経系はさしずめ整備された新しい高速ネットワーク、それより起源の古い迷走神経は脊髄を通らずに脳の下(延髄)から直接生えて内臓の不随意運動を支配するほか、表情や喉や発声といった随意運動にもかかわっている、いわば原始的な低速レガシーネットワークみたいなものと見立てることもできそうですね。

飲みすぎて吐いたりするのは主に迷走神経の働きだそうです。いつもお世話になってます。

レガシーだけど重要、そんな迷走神経のことをたまには思い出してあげるのもよし、そのままスカッと忘れるのもまたよし。

今週は以上です。

関連記事

今週の主なニュースソース

ソースの表記されていない項目は独自ルート(TwitterやRSSなど)です。

Rails公式ニュース

Ruby Weekly

OpenRuby

RubyFlow

160928_1638_XvIP4h

Hacker News

160928_1654_q6srdR

Github Trending

160928_1701_Q9dJIU

Ruby on RailsによるWEBシステム開発、Android/iPhoneアプリ開発、電子書籍配信のことならお任せください この記事を書いた人と働こう! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

hachi8833

Twitter: @hachi8833 コボラー、ITコンサル、ローカライズ業界を経てなぜかWeb開発者志願。 これまでにRuby on Rails チュートリアルの大半、Railsガイドのほぼすべてを翻訳。 かと思うと、正規表現の粋を尽くした日本語エラーチェックサービス enno.jpを運営。 仕事に関係ないすっとこブログ「あけてくれ」は2000年頃から多少の中断をはさんで継続、現在はnote.muに移転。

hachi8833の書いた記事

週刊Railsウォッチ

インフラ

BigBinary記事より

ActiveSupport探訪シリーズ