コメント_2019-07-17_011831

Rails 6と ngrok を組み合わせた開発が少し楽になるgemを作りました

どんな gem を作ったの?

Rails 6以降と ngrok を組み合わせた開発時に、 ngrok によって自動生成された domain を都度 Rails.application.config.hosts に 追加しなくてもよくなるgemを作りました。

※ v0.2.0 で localtunnel.mwe と serveo.ne にも対応しました。

ngrok って何?

皆さんは ngrok というサービスをご存知でしょうか。ローカルで動作するサーバーに対して、どこからでもアクセスできる一時的なURLを作成できるサービスです。

スマートフォンや別のPCなどから動作を確認したい場合に便利ですよね。

似たようなサービスに、 Localtunnel や Serveo がありますね。( v0.2.0 で対応しました)

 Ruby on Rails 6 の新機能について

そして Rails ですが、バージョン6からはDNS rebinding attackに対する対策として特定のhost以外からのアクセスを拒否する機能が導入されています。

正確には現時点でまだ 6.0.0 はリリースされていませんが、 6.0.0.rc1 の時点で導入されている機能なので、 6.0.0 に入ることは確実でしょう。

使い方としては、 Rails.application.config.hosts にアクセスを許可したい domain を指定していく、となります。

Rails 6 と ngrok を組み合せた開発の手間

開発環境、例えば手元のPC上で動いている rails server  に対してどこからでもアクセスできるURLを ngrok で発行すると、許可されてないホストからのアクセスという扱いになり、次のようなエラーが出ます。

このエラーを解決するために、都度 Rails.application.config.hosts に domain を追加していくのはとても面倒ですね。

rangrok によってその手間が無くなります

そこで、 rangrok という gem を作りました。

README にも書いたように、 rangrok を Gemfile に追加して bundle install するだけで、development 環境において ngrok.io を経由したアクセスは全て許可されるようになります。

gem 'rangrok, group: :development

ngrok を常用している Rails アプリケーションプログラマーの方には便利なのではないでしょうか?

……でも実は、gemじゃなくても?

皆さんが Gemfile に追加する gem ですが、依存関係として取り込む場合には軽く中身を確認するかと思います。

rangrok はとても小さな gem で、その本質は次に示す数行のコードです。

# https://github.com/haruelico/rangrok/blob/99ff70556fab85714ce41e2355fe21d02574900b/lib/rangrok/railtie.rb

class Railtie < ::Rails::Railtie
 initializer 'rangrok_add_ngrok_to_allowed_hosts' do
   Rails.application.config.hosts << ".ngrok.io" if Rails.env.development?
 end
end

これを見ればわかるように、 config/environments/development.rb に1行追加するだけで、この gem と同様のことを実現できます。

その1行をとるか、 gem に任せてしまうか…… 私なら直接書いてしまいますね。

ただ、Rails plugin gem を作ってみたかったのと、ふとこのアイデアがひらめいたので gem として作り、公開してみました。

よかったら使ってみてください。 issueや pull requestは大歓迎です!

この記事が気に入ったらサポートをしてみませんか?