- 開発
週刊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_tag
を6.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
については追いきれなかったので別記事にしたいと思います。
- 参考: Rails 5.0の ActionDispatch::Routing::PolymorphicRoutes
DeviseのRails 5.1対応はこれから
Railsの定番認証ライブラリであるDeviseでも、「5.1で動かないYO!」との声が届き始めています。
メジャー/マイナーアップデートでgemが続々とアップデートを迫られる光景はもうおなじみかと思いますが、5.1を実務に投入するのはこの辺が落ち着いてからがよさそうですね。
- 追記: Deviseは翌日に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チェックを削除
- Commit: No need to check nil
これはもう見たまんまですね。
return if new_attributes.nil? || new_attributes.empty?
# ↓
return if new_attributes.empty?
Rails: before_save
コールバックが2回呼ばれるバグを修正
特定の条件でコールバックが2回呼ばれることがあるというやっかいなバグをkamipoさんが果敢に修正しています。以下の多くのRailsバグ修正も大半がkamipoさんです。
Rails: ClassSpecificRelation
でmethod_missing
が先に呼ばれてしまうバグ
Kernel#respond_to_missing?
はRubyのメタプログラミング系メソッドですが、「こんなメソッドあったんか」「こういうときに必要だねー」「Ruby Gold試験のいやらしい問題で出てきそうだナ」といった声がありました。
- 参考: Rubyドキュメント:
Kernel#respond_to_missing?
Rails: respond_to_missing?
がpublicになっていたのを修正
修正箇所は以下です。
もうドラクエ中盤のごとくバッタバッタとなぎ倒しています。「日刊kamipoさん」とお呼びしたいです。
Rails: secrets.yaml読み込み時のsymbolize_keys
をdeep_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: 文章の修正など
- Commit: Add default_scope note to AR guide [ci skip]
- Commit: Add comma
- Commit: Reword sentence
- Commit: Improve documentation
https://github.com/rails/rails/commit/54fa07f2c87a7aad9a17539e409497e46d2607cdより
これも立派なコミットです。実際、コメントの英文とかって走り書きが多くて、フレーズ同士の接続もときどき怪しかったりするんですよね。一次資料であるAPIドキュメントの文章がユルユルだと本当に困ってしまいますので、こういう修正は助かります。
「英語圏の人なら誰でも隙のない完璧な英語を書ける」なんてことはまったくありませんのでご安心ください。技術英文はむしろこういうことに寛大で、少々言い回しが稚拙なぐらいであればたいてい黙って許容してくれますが、逆に言い回しについてはよほどひどくないとなかなかツッコんでくれません。
コードと同様、英文作成の上達にもレビューやマサカリが必要なんですけどね。
Ruby: Array#to_s
の実装が重複していたのを削除
ここからはRubyのissueです。
エイリアス化されているので一方は不要だったそうです。
Ruby: Range#count
をRange#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」という曲もいくつもあるようです。
初めてのRailsアプリを確実にデプロイするための心得(RubyFlowより)
初心者がやるべきこと
- 「よいソフトウェアとは何か」を今一度自問自答する
- scaffoldをためらわずに使う
- feature Specをちゃんと書く
- 自分の技術が未熟なことをくよくよ悩まない
- パレートの法則を胸に刻みこむ
- 将来改修が行われることをユーザーにしっかり理解してもらう
初心者に避けて欲しいこと
- モデルでコールバックを使うこと
- 何でもかんでもコントローラでやろうとすること
表現力豊かなRSpecテスト(part 1)テストを正しく書くには(RubyFlowより)
「これはpart 2が出てからでいいかなー」という声がありました。
SaaSで測定すべき3つの要素と改善方法
- 顧客を得るコスト
- 顧客が使ってくれる期間
- 1か月あたりに離れた顧客の数(churn)
Railsで検索とオートコンプリートを実装する
比較的長い記事ですが、ほとんどが手順なのですっと読めると思います。
Railsでのautocompleteということもあり、Ajaxやサーバ側のJSONインターフェース作成もあるので「初級者向けの練習にはいいんじゃね?」「実務で役に立つわこれ」という声がありました。
Railsチュートリアルを終えた後にやることが見つからない方におすすめです。
PDF書籍: Fearless Refactoring: Rails controllers
49ドルです。サイトを開くと、before_filter
で汚れまくったコントローラのコードがババーンと登場。
コントローラのリファクタリングに興味のある方向け。
Rubyの弾力性: エラーハンドリング(Ruby Weeklyより)
元GitHubの中の人が、エラー処理を初歩から丁寧に解説しています。エラー処理に関心のある方向け。
この頃流行りのWebデザイン5種(2017年)
今はこんな感じだそうです。
- Serifフォント
- ナチュラルカラーパレット
- メガナビゲーション(Meganavi)
- オーバーラッピングコンテンツ
- グラデーション(また?)
Webデザインはアパレル業界と違って、誰かが裏で手を回して流行をコントロールするみたいなことはやりにくそうですね。「フォントってWebデザインだっけ?」という声も。
Zen Railsセキュリティチェックリスト(Ruby Weeklyより)
ankane/secure_railsも同種のチェックリストですが、Zenの方が星は多いですね。
「もうこういうチェックリストより自動チェックの方が重要!」「そこでbrakemanですよ」という意見がありました。
jemallocでRubyアプリのメモリ使用量とパフォーマンスを改善(Ruby Weeklyより)
Heroku上のアプリで、デバッガ的なライブラリをレイヤにはさんでパフォーマンスをチューニングしている感じです。「jで始まるとどうもJavaがらみに見えちゃうよね」という声も。
番外: パーキンソン病は腸から迷走神経を伝って脳に転移する可能性
迷走神経(vagus nerve)を切除した人はパーキンソン病の発生率が低かったそうです。医学英語はラテン語が多いうえにドイツ語っぽい合成語も多くてむずいです。
そういえば人間の神経系のうち、脊髄を中心とする神経系はさしずめ整備された新しい高速ネットワーク、それより起源の古い迷走神経は脊髄を通らずに脳の下(延髄)から直接生えて内臓の不随意運動を支配するほか、表情や喉や発声といった随意運動にもかかわっている、いわば原始的な低速レガシーネットワークみたいなものと見立てることもできそうですね。
飲みすぎて吐いたりするのは主に迷走神経の働きだそうです。いつもお世話になってます。
レガシーだけど重要、そんな迷走神経のことをたまには思い出してあげるのもよし、そのままスカッと忘れるのもまたよし。
今週は以上です。
関連記事
- 週刊Railsウォッチ(20170421)RailsConfが来週アリゾナで開催、コントローラを宣言的に書けるdecent_exposure gemほか
- 週刊Railsウォッチ(20170414)サーバーを危うくする1行のコード、PostgreSQL 10の新機能ほか
- 週刊Railsウォッチ(20170407)N+1問題解決のトレードオフ、Capybaraのテスト効率を上げる5つのコツほか
- 週刊Railsウォッチ(20170331)PostgreSQLの制約機能を使えるRein gemはビューも使えるほか
- 週刊Railsウォッチ(20170324)Ruby 2.4.1リリース、GAEがついにRubyに対応、このgemがないと生きていけない27選ほか
- 週刊Railsウォッチ(20170317)Railsパフォーマンスチューニング本、DBレコード存在チェックの最速メソッド、RubyのUnicode正規化ほか
- 週刊Railsウォッチ(20170310)クールなDocker監視ツールCtop、RailsがGoogle Summer of Code 2017に正式参加、Unicode 10.0.0ドラフト発表ほか
- 週刊Railsウォッチ(20170303)5.0.2正式リリース、メタプログラミングに懲りた話、bundler 1.12のバグ、すぐ試せるWebアノテーションほか
- 週刊Railsウォッチ(20170227)Rails 4.2.8リリース、SHA-1コリジョンアタック、便利なハッシュ変換ツールほか
- 週刊Railsウォッチ(20170217)Rails 4.2.8.rc2リリース、Ruby 2.4正規表現とActiveSupportのnormalizeほか
- 週刊Railsウォッチ(20170210)JRubyやRubiniusの配列への追加はスレッドセーフではないほか
- 週刊Railsウォッチ(20170203)AnyLogin gemで開発中に楽々再ログイン、イベント数ベース課金の監視サービスRollbarほか
- 週刊Railsウォッチ(20170127)わかりやすいAWSサービス名、Rails DBは便利、TruffleRubyの驚異的速度ほか
- 週刊Railsウォッチ(20170120)Ruby 2.5.0 devリリース、古いMySQLのサポート終了、uniqメソッドが削除ほか
- 週刊Railsウォッチ(20170116)Ruby 2.4の詳細、範囲指定したsumメソッドは速い、rescueの挙動を動的に変更ほか
- 週刊Railsウォッチ(20170110)ReactをRailsに置き換える、Ruby 2.4の新機能ほか
- 週刊Railsウォッチ(20161224)Float#roundの動作変更を取り消し、Rails 5.0.1/Ruby 2.4.0-rc1リリースほか
- 週刊Railsウォッチ(20161218)Ruby 2.4ではFloat#roundの動作が変わる、デフォルトのプライマリキーをBIGINTに変更ほか
- 週刊Railsウォッチ(20161209)Active Supportの非推奨メソッド廃止、RailsのjQueryへの依存を廃止ほか
- 週刊Railsウォッチ(20161125)Railsのデータベース・ベストプラクティス、SQLインジェクション解説ほか
- 週刊Railsウォッチ(20161117)DockerホスティングのHyper.sh、accepts_nested_attributes_for殺すほか
- 週刊Railsウォッチ(20161109)bundler audit gemは超おすすめ、CIAのFactbook gemほか
- 週刊Railsウォッチ(20161102)HTML 5.1正式勧告、CSS中央揃えに便利なサイトほか
- 週刊Railsウォッチ(20161027)LinuxカーネルのDirty COW脆弱性、DeviseはWikiを読めほか
- 週刊Railsウォッチ(20161019)ObjectSpaceモジュール活用法、Capybara統合、コミッターを撮影するソフト
- 週刊Railsウォッチ(20161012)RubyのHashの詳細、RethinkDBの会社が終業ほか
- 週刊Railsウォッチ(20161005)Mac OS SierraとRubyの問題、Learning Gitほか
- 週刊Railsウォッチ(20160928)constantizeの注意点、GoのGUI “gallium”登場ほか
- 週刊Railsウォッチ(20160921)クールなHTMLエディタ「Mozilla Thimble」他
- 週刊Railsウォッチ(20160913)MySQLの脆弱性ほか
今週の主なニュースソース
ソースの表記されていない項目は独自ルート(TwitterやRSSなど)です。