Sooey

2014-07-19 03:25:13 +0900

jQueryでは、クロスドメインなAjaxを行った際にはリクエストヘッダにX-Requested-Withが付かないようだ。

サーバー側のRailsで

if request.xhr?

といった条件で判定しているような場合に条件が真にならずにはまるので、そのようなケースでは以下を参考に

サーバー側がOPTIONSメソッドによるpreflightリクエストに応答できるようにした上で、jQueryのAjaxリクエスト時のsettingsに

headers: {'X-Requested-With': 'XMLHttpRequest'}

を含めるようにする必要がある。

2014-07-08 11:17:15 +0900

Railsアプリのステージング環境を自動で構築してくれるTeatroというサービスの話。

Teatro

動作の流れは、

  1. GitHubアカウントでサインアップする
  2. 連携させるリポジトリを選ぶ(GitHub側にフックが設定される)
  3. リポジトリにPull Requestが作成されると、自動的にステージング環境の構築が始まる(その際、PRにもコメントがされる)
  4. ステージング環境の構築が完了すると、http://ブランチ名.Organization名-リポジトリ名-トークン.ttrcloud.com/ のようなURLが割り当てられる

といった感じ。

詳細な設定方法やどんなミドルウェアが使えるのかについては、Helpを参照しましょう。

現時点では以下のミドルウェアが使えるようです。

  • PostgreSQL
  • MySQL
  • Redis
  • Elasticsearch
  • RabbitMQ
  • MongoDB

試しに、Heroku上でRails 4.1 + PostgreSQL 9.3で運用しているアプリに対して使ってみたところ、

  • config.ruに日本語コメントがあったのでUnicornの起動時にinvalid byte sequnceで落ちた
  • production.rbconfig.force_ssl = trueしているためhttps://なURLにリダイレクトされるが、そこでアプリのページではなくTeatroのトップページが表示されてしまう(Teatroのステージング環境ではenvironmentがproductionとなる)

といったところでハマりました。特に後者は今のところどうにもならなそうな気がするので検証はそこまで。

TeatroはまだBetaのようですが、お値段はアクティブなステージング環境5個、プロジェクト10個、ユーザー無制限で$50/mo.と、ビジネスで使うならわりとリーズナブルだと思うので、ちゃんと動作するようになったら導入してみてもいいかなと思いました。

以下、試した際のスクリーンショット。

Screen Shot 2014-07-08 at 10.37.49 AM

Screen Shot 2014-07-08 at 10.39.00 AM

Screen Shot 2014-07-08 at 10.44.33 AM

Screen Shot 2014-07-08 at 10.44.42 AM

Screen Shot 2014-07-08 at 10.47.30 AM

Screen Shot 2014-07-08 at 10.48.18 AM

Screen Shot 2014-07-08 at 10.48.37 AM

Screen Shot 2014-07-08 at 10.48.46 AM

Screen Shot 2014-07-08 at 10.48.57 AM

Screen Shot 2014-07-08 at 10.52.24 AM

2014-05-28 16:33:56 +0900

RSpec 3.0でのコレクションに対するマッチャーの使い分けメモ。

コレクションに値が含まれることの検証:

expect([a, b, c]).to include(a, b)  # Success
expect([a, b, c]).to include(d)     # Failure

コレクションの要素が完全に一致することの検証:

expect([a, b, c]).to contain_exactly(c, b, a)  # Success
expect([a, b, c]).to contain_exactly(c, b)     # Failure

コレクションの要素と順序が完全に一致することの検証:

expect([a, b, c]).to match([a, b, c])  # Success
expect([a, b, c]).to match([a, c, b])  # Failure

2014-05-28 13:43:27 +0900

ActiveSupportのKernel#captureKernel#silence

ActiveSupportにはKernel#captureというメソッドとそのエイリアスであるsilenceが定義されていて、以下のようにストリームへの出力を横取りできる。

stream = capture(:stdout) { puts 'notice' }
stream # => "notice\n"

silence(:stderr) { ... }

これまでは標準出力などに出力を行うクラスをテストする際に、このメソッドで出力を抑止していたが、RSpec 3.0からはoutputマッチャーを使うと、同様のことが以下のように記述できる。

expect { puts 'notice' }.to output("notice\n").to_stdout

今後は、出力内容をテストしたい場合はoutputマッチャーを使い、単に出力を抑止したい場合はKernel#silenceという使い分けになりそう。