Railsのjs-routes
gemはクライアントサイドでURLヘルパーを使えるようにできるgemで、大変便利です。
Gemfileにgem "js-routes"
を書いてインストールしたうえで、asset pipelineのapplication.js
あたりでrequire js-routes
としておきます。すると、Rails側で使えるuser_path(@user.id)
みたいなヘルパーメソッドがJSでも使えるようになって、↓なふうに使えます。
Routes.user_path(1)
ハードコーディングしなくてよくなるのでなかなか便利です。
ところでこの導入手順ではJSがSprocketsに乗っています。つまりWebpackerのみを使っているプロジェクトではこの方法での導入ができません。
Webpackerで使うには
js-routes
gemにはRubyのクラスJsRoutes
というのがいます。これがgenerate
メソッドとgenerate!
メソッドを持っています。
まずはわかりやすい方のgenerate!
から。こちらはuser_path
などの定義を書いたJavaScriptのコードをファイルに書き出すというものです。
generate
は、というとJavaScriptのコードを文字列として返すメソッドです。Webpackerではこちらを使うと良いです。
というのはStack Overflowからの受け売りなのですが、実際に試してみました。
まずはjs-routes
gemを普通にインストールします。
続いてerb-loader
を有効にしておきます。erbを使う方法についてはこちら↓の記事でも書いています。
Routes用のファイルを用意
Webpackerのエントリポイントのファイルがapp/javascripts/packs/application.js
だったとして、1つ上の階層にjs-routes.js.erb
つまり(app/javascripts/js-routes.js.erb
)というファイルを作ります。
中身はerbでgenerate
の結果がそのままJSになるように書いておきます。
<%= JsRoutes.generate %>
Ruby側のJsRoutesがJavaScriptコードを書き出してくれるので、それをそのままこのjs-routes.js.erb
の内容としておくわけです。
Webpackerでimport
あとはメインのファイル(app/javascripts/packs/application.js
)にて、このファイルをインポートします。
import Routes from '../js-routes.js.erb'
// 必要に応じてグローバルに
window.Routes = Routes
Webpackerでも使えるようになりました。