LoginSignup
27
29

More than 5 years have passed since last update.

JSでRailsのヘルパーメソッドを限定的に利用するためのgem

Last updated at Posted at 2015-05-14

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等に渡す引数と同じ。
その他共有しておきたい設定値を記述する。

config/rails_js_helper.yml
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が必要になるのがそもそも大分辛いのだが……。

27
29
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
27
29