4

Rails 3.1 アプリの場合、サイト全体の JavaScript の一部は、特定のリアルタイムのインスタンス固有の条件が満たされた場合にのみ含まれます。これは、新しいアセット パイプラインの application.js に配置できないことを意味します。これは、現在のコンテキスト内に埋め込まれた Ruby について erb によって解析されないためです。基本的に、ログインしている current_user に基づいて、キーボード ショートカットを含めています。

私の質問: コードが埋め込まれたこの JavaScript をどこに移動すれば、適切なコンテキスト (つまり、現在ログインしているユーザー) でページ アクセスごとに埋め込み Ruby が引き続き解析されるようになりますか?

答えは、一番下の application.html.erb レイアウト ビューに配置するだけのようですが、これは、直感的でない場所に JavaScript コードを隠しているように見えます。

application2.js.erb ファイルを作成しようとしましたが、未定義の変数に関するエラーが発生しました。これは、出力がキャッシュされる前にアセット エンジンがこのファイルを 1 回だけ解析し、スコープがまだ正しくないためであると考えられます。 current_user のようなもの。

したがって、ここでは application.html.erb を使用しても問題なく動作します。これは、機能的に動作させる方法の問題ではありません。代わりに、ここでアセット パイプライン モデルを要件に組み込み、JavaScript のほとんどを assets/javascripts ディレクトリに保持する、より洗練された方法があるかどうか疑問に思っています。

4

3 に答える 3

0

さて、目立たないjsについて。これは単なる概念 (HAML) になります。

あなたの視界のどこかで

# hotkeys are "Ctrl+C", "Ctrl+A"
-current_user.hotkeys.each do |hotkey|
  %hotkey{ "data-key" => hotkey.key, "data-behavior" => hotkey.fn  }

次に、あなたのapplication.js

$(document).ready(function(){
  if($("hotkey").length > 0){
    $("hotkey").each{function(this){
      key = $(this).data("key");
      fn  = $(this).data("behavior");
      $(document).bind('keydown', key, fn);
    }}
  }
})

したがって、まったく同じ JS が HTML ホットキー データから抽出してバインドします。

于 2011-09-07T07:16:39.293 に答える
0

一部の人々が指摘したように、2 つのオプションは次のとおりです。

  • JavaScript をビュー内に配置します (そして、あなたが言うように、これはまったく正しくありません)。
  • JavaScriptファイルに入れます。特定の条件が満たされた場合、この JavaScript ファイルを含むビュー内で条件を作成します。

コントローラーから JavaScript にさらに多くのインスタンス変数を渡す必要がある場合は、gonと呼ばれるこの gem を使用すると作業が楽になります。

これにより、次の JavaScript を使用してデフォルトのアセット パイプラインを使用できます。

if(gon.conditional){
  //your embedded js code here
}

この宝石についてもっと知りたい場合は、すべてが説明されているこのレールキャストをチェックしてください。

于 2013-09-12T19:33:19.893 に答える
0

app/assets/javascripts/application2.js.erb (または思いついたより適切な名前) を作成してみてください。

そして、次のようなものを app/assets/javascripts/application.js に入れます:

//= require application2

そして、あなたは持つことができます

<%= javascript_include_tag 'application2' %>

好きな場所 - たとえば、application.html.erb など。

ところで、ビューごとに含まれるものをカスタマイズしたい場合は、content_forが役立つかもしれません。このスクリーンキャストをチェックしてください

于 2011-09-05T22:35:55.527 に答える