概要
みなさんこんにちはcandleです。
今回はcoffeescriptを任意のURLで実行する様にする関数を作ります。
というのはrailsは最終的にassetspiplineでjavascriptファイルをひとまとめにするのですが、
そうなると、不本意なところでjavascriptが動いてしまう事が多々あります。
もちろん、だったら、誤作動しない様にコーディングするのが一番良いのでしょう。
ただ、私はjavascriptに慣れていないので、そこまで完璧なコードが書けません。
また、外部のjavascirptライブラリを使う場合はrailsのそういったものを想定していない事があるので、万が一の事も考えて使えると便利かもしれません。
前提
適当なrailsプロジェクトがある
url判定をする関数を作る
まずはrailsプロジェクトのapp/assets/javascripts/application.jsを開きます。
一番下に以下の関数を作成します。
function url_match(){ var url = window.location.href; for (var i = 0; i < arguments.length; i++) { if(url.search(arguments[i]) < 0){ return false; } } return true; }
この関数がやっている事はurlを取得して、argumentsで実際に使う時に渡す可変長引全てに対して、
その引数がurlに含まれているかどうか判定しています。
引数の中の文字が1回でもurlに含まれていなければ、falseを返して、全て含まれていれば、trueを返します。
coffee scirptで使う
例えば、scaffoldを作成すると、それに準じたcoffeescriptが作成されると思います。
squireというscaffoldを作成した場合はsquire.js.coffeeが作られます。
ここに以下の様に書くと、squiresコントローラー内でのみcoffee scriptが実行されるようになります。
$(document).on 'ready page:load', -> if url_match('squires') console.log "ここはsquireのscaffoldだよ"
さらにアクションを指定したい場合はカンマで区切ってやれば良いでしょう。
作成した、関数は可変長引数なので、幾らでもurlの限定を加えられます。
この場合はAND検索になります。
下の場合はsquiresコントローラーのnewアクションとeditアクションでcoffeescriptが動作します。
$(document).on 'ready page:load', -> if url_match('squires','edit') || url_match('squires','new') console.log "squriesコントローラーのeditアクションかnewアクション"
まとめ
アセッツコンパイルは便利です。誤作動を極力抑え、よりバグ無く、高速なサービスを作りましょう。