Railsではassets:precompileをした時にファイルのハッシュ値をファイル名の末尾に追加してキャッシュ管理を楽にする機能があります。
JSの内部でそれを検知することは基本的にできないため、.coffee.erb
などという形にしてRailsのヘルパーをerbの形で埋め込んだりします。
しかし、これが氾濫するとlintが使えないしエディタによってはシンタックスハイライトも死ぬし、もしSprocketsを将来的に外したくなった時に非常に邪魔になります。
なので、必要になるにしても局所化したい。できれば余り目に付かない所に押し込めたい。
というわけで、限定的にRailsのヘルパーメソッドっぽいものをJS上に定義するgemを作りました。
名前が思い付かなかったので、単純に rails_js_helper というgemです。
使い方
コンフィグファイルの生成
$ bundle exec rails g rails_js_helper:config
# And edit config/rails_js_helper.yml
コンフィグには利用する画像やcss等のパスを指定する。
この時指定する値はimage_path
等に渡す引数と同じ。
その他共有しておきたい設定値を記述する。
images:
- loading.png
assets:
- loading.css
configs:
google_api_key: <%= Rails.application.config.x.google_api_key %>
JS内でこんな感じで呼べるようになる。
#= require rails_helper
RailsHelper.imagePath("loading.png") # => "/assets/loading.png"
RailsHelper.imageTag("loading.png", width: 120) # => <img src="loading.png" width="120">
RailsHelper.assetPath("users.css") # => /assets/users.css
RailsHelper.pathFor("users", format: "json", foo: "bar") # => "/users.json?foo=bar"
RailsHelper.pathFor("new_users") # => "/users/new"
RailsHelper.routeNames() # show all route names on javascript
RailsHelper.config.google_api_key # => value of `Rails.application.config.x.google_api_key`
プリコンパイルされるとちゃんとハッシュ付の値に置き換わる。
名前付きルートのヘルパーは自動的にRailsのルーティング定義から引っ張ってきてヘルパーを定義する。
しかし引数が必要になるセグメント付きのルートはちょっとやそっとじゃ関数化できなさそうだったので対応していない。
なので、例えば/users/:id
といったルートを生成するヘルパーは定義されないようになっている。
まあ、画像ファイル類はまだしも、名前付きルートのヘルパーをJSで利用するのはあんま良くないと思います。
そして、こういうgemが必要になるのがそもそも大分辛いのだが……。