タケユー・ウェブ日報

Ruby on Rails や Flutter といったWeb・モバイルアプリ技術を武器にお客様のビジネス立ち上げを支援する、タケユー・ウェブ株式会社の技術ブログです。

Ngrokなどのトンネリングツールを使うときは、 default_url_options をトンネリングURLのものにしたい

f:id:uzuki05:20181215091555j:plain

ローカル開発中のRailsアプリに外部からのリクエストを届かせる必要があるとき、Ngrokは便利です。

たとえば

  • 開発中のアプリなどを実機で動かしてて、ローカルのRails APIサーバーと通信したい
  • 外部のサービスからのリクエストを受け取る必要がある

といったときです。

通常、Railsでは、url_forホスト部などはHTTPリクエストのヘッダー情報から取得して組み立ててくれるのですが、たとえば graphql-ruby のフィールドなど、コントローラー以外で Rails.application.routes.url_helpers.url_for(user) を使った場合など、 default_url_options がないとうまくいかないケースもあります。

そんなとき、いちいち config/environments/development.rb を編集するのは面倒ですし、うっかり変更したままコミットする悲しい事故も起こります。

そこでこんなコードを書きました。 こうしておけば必要なときに default_url_options を変えることができます。

# config/environments/development.rb

Rails.application.configure do

   # (省略)

  # echo "https://xxxxxxxxxxxx.jp.ngrok.io" > tmp/default_url_options.txt
  # bin/rails restart
  default_url_options_path = Rails.root.join('tmp', 'default_url_options.txt')
  if default_url_options_path.exist?
    default_url = default_url_options_path.read.strip
    uri = URI(default_url)
    config.hosts << uri.host

    Rails.application.routes.default_url_options = {
      host: uri.host,
      port: uri.port,
      protocol: uri.scheme
    }
  else
    Rails.application.routes.default_url_options = {
      host: 'localhost',
      port: 3000
    }
  end
end