おもしろwebサービス開発日記

Ruby や Rails を中心に、web技術について書いています

RejectKaigi2017でファイルアップロードについて発表した

先日行われたRejectKaigi 2017でファイルアップロードについて発表しました。資料はこちら。

内容的には、WEB+DB PRESS Vol.95で書いたファイルアップロード話を最新にしたものになります。Rails5.2で新しく追加されるActive Storageというファイルアップロード機能を紹介しつつ、ファイルアップロード全般の話題について触れています。

ファイルアップロードをただしく実装するにはそれにまつわる様々な要素についての知見が必要で、webエンジニア的には腕の見せ所ではないかと思います。Active Storageの登場でファイルアップロードについての知見が広まって、ただしく実装できる人が増えるといいなと思います(( ⁰⊖⁰)/)

あわせて読みたい

WEB+DB PRESS Vol.95
WEB+DB PRESS Vol.95
posted with amazlet at 17.08.20
小出 淳子 黒澤 剛志 牧 大輔 横江 亮佑 山口 貴也 尾藤 正人 佐藤 琢哉 中橋 研太郎 田中 慎司 小西 裕介 伊藤 直也 稲富 駿 前島 真一 長野 雅広 山際 康貴 のざき ひろふみ うらがみ 岡林 大 遠藤 雅伸 ひげぽん 海野 弘成 はまちや2 竹原 大場 寧子 大場 光一郎 野々下 裕子
技術評論社
売り上げランキング: 281,045

「Rails5.1時代のアプリケーション開発」というテーマで発表した

昨日「Rails5.1時代のアプリケーション開発」というテーマで発表しました。

MedBeer -Rails 5.1での開発について- - connpass

スライドはこちら。内容的には、web開発難しいので頑張って勉強していきましょうというメッセージになっています。若干エモ寄り。

web開発における知の高速道路みたいなものがあるとよいのですが、学ばなければいけない要素技術は日に日に増えていくので頑張って道路を作ってもすぐ陳腐化していきます。なのでレベルを上げて物理で殴るのが現状の最適解かなと。みんなでレベル上げ頑張っていきましょう💪

ActionCableでフィーチャスペックを書く

最近自分の作っているサービスにActionCableを導入しました。そこでフィーチャスペックを書いていくつかハマったので内容を共有します。

使っているのはcapybara & poltergeistです。

Capybara.serverをpumaにする

Capybaraのデフォルトのサーバは、ざっと見た感じRailsアプリを別スレッドで動かしているだけのようです。これではActionCableを動かすことはできません。ActionCableを利用するにはpumaを使う必要があります。

次のようにすれば Capybara はpumaをサーバとして使ってくれます。

Capybara.server = :puma

これでオーケー…と言いたいところですが、まだ落とし穴が2つほどあります*1

puma のデフォルトワーカ数(プロセス数)を1にする

(追記)最近のcapybara(2.15.1以上?)を使っている場合、config/puma.rbの設定に関わらずワーカ数は1に設定されるようになったみたいです。

pumaはconfig/puma.rb があると、テスト時でもそれを設定に利用します。developmentやtestの環境ではActionCableのアダプタはasyncが設定されているため、pumaのプロセス数が2以上だとうまく動かないケースがあります。

次のように環境変数が設定されていない場合は1になるようにしておきましょう。

workers ENV.fetch("WEB_CONCURRENCY") { 1 }

ActiveJobのテストと環境を分ける

(追記)コード見た感じ、同一プロセス内の別スレッドでサーバ起動しているように見える&&実際にpumaで問題なく動くようだったのでこの節は読み飛ばしてください><

capybara/server.rb at master · teamcapybara/capybara · GitHub

前提として、ActiveJobのテスト用のアダプタはデフォルトの:testです。

Capybaraデフォルトのサーバを利用する場合は同一プロセス内でサーバが動くので、サーバ内でキューにジョブを詰めたとき、テストコード内でassert_enqueued_jobsなどのメソッドで実際にキューにジョブが入ったかを確認することができます。しかし、サーバをpumaにした場合は別プロセスになり、サーバ内でキューにジョブを詰めても、テストコード内では確認することができません。

ではActionCableを利用した場合だけサーバをpumaに変えればいいのでは?と思い次のようにしたのですが、フィーチャスペックが不安定になったのでやめました。どうやらserverはdriverのように頻繁に変更するようにはできていないようです(深掘りはしていません)。

config.around(:example, websocket: true) do |example|
  default_server = Capybara.server
  Capybara.server = :puma
  example.run
  Capybara.server = default_server
end

とりあえず次のように、通常のテストはActionCable以外をテストし、ActionCableを使ったテストだけを実行したい場合は環境変数をつけるようにしました。

if ENV['WEBSOCKET'].present?
  config.filter_run_including :websocket
else
  config.filter_run_excluding :websocket
end

これでテストが通るようになりました🍏

*1:僕はきっちりハマりました><

rspec-style-guideの英語版ができた

先日のRails Developer Meetupで発表したrspec-style-guideですが、ありがたいことにPull Requestをいただき英語版ができました。

rspec-style-guide/README_EN.md at master · willnet/rspec-style-guide

Pull Requestしてくれた@gazayasさんありがとうございます!

内容に関する意見などは今のところまだ来ていないのですが、英語版ができたことで広く目にとまる可能性が出てきましたね。

関連情報

Rails Developers Meetup で綺麗なテストコードの書き方について発表した - おもしろwebサービス開発日記

ぎんざRuby会議を開催します

毎月第三火曜日に開催しているginza.rb、開催を始めてからかれこれ4年になります。このままいくと8月にはなんと第50回のミートアップをむかえることに。というわけで拡大版を開催することにしました。

ぎんざRuby会議です。

f:id:willnet:20170524230229p:plain

公式サイトにも気合が入っています。ginza.rbに参加したことのある人はおなじみ@ken1flan画伯の「ざぎんねこ」を使って@ken_c_loさんにうまく誂えてもらいました。

日付は8月5日(土)、テーマはRailsです。このテーマにした理由は、Railsの話がメインの日本のカンファレンスが需要の割に少ない気がしたことと、あとはもちろん*1Railsが好きだからです。

招待講演には@amatsudaさんと@kamipoさんというビッグネームに登壇いただけることになりました。

残りの発表枠は公募としています。通常発表枠(25分)とLT枠(5分)です。Railsの話をしてくれる方、いま絶賛大募集をしています*2。あなたが温めている秘伝の知見を教えてください。ぜひぜひよろしくお待ちしています。

ぎんざRuby会議01 CFP - Ginza.rb

話を聞きに来たいという方は予定を空けてお待ち下さい。6月頃に募集を開始します。

*1:言うまでもないですね

*2:6月9日締め切り予定です

Rails Developers Meetup で綺麗なテストコードの書き方について発表した

昨日のRails Developers Meetupで綺麗なテストコードの書き方について発表してきました。

Rails Developers Meetup #1(東京会場) - connpass

資料はこちら

余談

もともと数年前くらいから、テストコードの書き方についてまとめたいなーと思っていたのですがなかなかキッカケがなくて手を付けられていませんでした。今回のミートアップ駆動で一通り形にするところまでいけて今とてもスッキリした気持ちです 😇 もっと多くの人にテストコードの書き方を意識してもらいたいので、また機会があればどこかで喋りたいですね。

昨日発表した内容はGitHubリポジトリにまとめたものの一部です。綺麗なテストコードの書き方について詳しく知りたい方は下記のリンクからどうぞ。

willnet/rspec-style-guide

お願い

今回まとめた内容はあくまで僕が考えるテストコードの書き方なので、異論反論あると思います。意見ある方はIssueなりPull Requestなり、ブログエントリにまとめるなりしていただけるととても嬉しいです!

メドピア開発者ブログに寄稿した

お手伝いしているメドピアさんのブログに、Railsのコード可読性を保つための知見の一つであるform objectについて寄稿させていただきました。

form objectを使ってみよう - メドピア開発者ブログ

最近は技術顧問として複数社のエンジニアに対して、主にRailsアプリケーションを可読性を保ちつつ作るための知見を伝えるような仕事をやっています。具体的な仕事内容については別エントリで書くかもしれません。

寄稿した内容の補足

エントリ後半の、「Active Recordモデル中のvalidationやメソッドをform objectに移してモデルをスリムにする」話はジョーカーさんのツイートのように、チーム全体で徹底できていないとダメなので取り入れるには若干のハードルがあります。

ただ、エントリ前半のActive Recordを使わないケースでform objectを使うのはデメリットがほぼないはずなので全国的に広まってほしいなという気持ちです :pray:

寄稿先のエントリでも書きましたが、複数の会社で同じことを何度も説明するのは大変です><。説明回数を減らすために、他の知見もこのブログやお手伝い先のブログなどで積極的にまとめていくつもりなのでご期待ください*1。もし、うちにも寄稿してほしい!という会社さんありましたらご連絡ください*2

*1:忙しいので時間かかるかもしれません><

*2:予め断っておくと有料です><