2013-07-11 13 views
68

link_toヘルパーをレールに使用すると、JavaScriptが読み込まれない場合があります。私は手動で 'localhost:3000/products/new'のURLを入力するか、ページをリロードするとjavascriptがロードされますが、以下のようなリンクをたどると、jQuery $(document).readyは新しいページにロードされません。Rails、link_toヘルパーをクリックした後にJavaScriptが読み込まれない

<%= link_to "New Product", new_product_path %> 

products.jsが

$(document).ready(function() { 
    alert("test"); 
}); 

すべてのヘルプははるかに高く評価されるだろうファイル:私はこのリンクをクリックしたときに

LINK_TO、Javascriptをロードしません。前もって感謝します!

答えて

125

あなたはRails 4を使用していますか? (コンソールでrails -vを実行して確認してください)

この問題はおそらく新しく追加されたTurbolinksの宝石によるものです。これにより、アプリケーションは1ページのJavaScriptアプリケーションのように動作します。いくつかの利点(it's faster)がありますが、残念ながら$(document).ready()のようないくつかの既存のイベントは中断されます。これは、URLを直接読み込むときにJavaScriptが動作する理由を説明しますが、link_toでナビゲートするとJavaScriptが動作しない理由を説明します。

TurbolinksについてはRailsCastです。

いくつか解決策があります。あなたはドロップインフィックスとしてjquery.turbolinksを使用することができ、またはあなたの代わりにTurbolinks 'page:change'イベント使用するように$(document).ready()文を切り替えることができます。また

$(document).on('page:change', function() { 
    // your stuff here 
}); 

を、あなたはだけでなく、通常のページのロードとの互換性のために、このような何かを行うことができますTurbolinks:

var ready = function() { 
    // do stuff here. 
}; 

$(document).ready(ready); 
$(document).on('page:change', ready); 

あなたはRuby on Railsでを使用している場合は、> 5(コンソールでrails -vを実行することで確認することができます)の代わりに'turbolinks:load'を使用'page:change'

$(document).on('turbolinks:load', ready); 
+0

をはい、これはあなたが投稿のlink_toのクリックによってそれを修正しない何Railsの4です。それはまた、通常の手動のURLページの読み込みでは動作しません、私のjsコードを複製せずに両方のメソッドを介して動作させる方法はありますか?ありがとう! – StickMaNX

+1

ええ、それは奇妙です。私はそれが両方のために働くと思うだろう。おそらくリンクされたjquery.turbolinks gemを使用することをお勧めします。注:私はそれを使用していないので、私は確信していません。それは、 '' page:load''を再バインドして '$(document).ready()'を呼び出すように見えます。 –

+0

私はjquery.turbolinksなしで動作するはずの解決策を作るために私の答えを編集しました:) –

56

私は同じ問題を抱えていますが、jquery.turbolinksは役に立ちません。私はGETメソッドをオーバーライドする必要があることに気付きました。

私のサンプルがあります:

<%= link_to 'Edit', edit_interpreter_path(@interpreter), method: :get %> 
+2

それは私のために働いた。 –

+2

これは最も速い実装方法でした。 –

+2

メソッド::getは私の問題を解決します –

4

ます。また、データ-NO-turbolinkを指定していないのdivであなたのリンクをラップすることができます。

例:

<div id="some-div" data-no-turbolink> 
    <a href="/">Home (without Turbolinks)</a> 
</div> 

出典:https://github.com/rails/turbolinks

+0

これは完全に機能しました!ありがとう – Michael

2

あなたが任意のインラインに<script>タグを持っていないことを確認してください。 (インラインスクリプトタグはターボリンクでは悪い)。

2

FWIW、Turbolinks docsから、$(document).readyの代わりにキャプチャするより適切なイベントはpage:changeです。

page:loadは新しいボディ要素がDOMにロードされている。

...それはキャッシュのリロードには発生しませんという警告があります部分的な置き換えやページがキャッシュから復元されたときに起動しないため、同じ本体で2回実行されません。

Turbolinksはビューを切り替えるだけなので、page:changeが適切です。

+0

受賞者! 'page:load'はリフレッシュ時に私のために働いていませんでした。私はこのソリューションをお勧めします。 –

20

あなたはレール5の代わりに、'page:change'上にある場合は、このような'turbolinks:load'使用する必要があります。

$(document).on('turbolinks:load', function() { 
    // Should be called at each visit 
}) 

出典:https://stackoverflow.com/a/36110790

+0

これとIce-Blazeの両方の解決策が私のために働いた。しかし、私はすべてのリンクを変更する必要がないので、私はこのベストが好きです。 (私はRails 5を使用しています) – Sean

関連する問題