0

Asset_pathを使用したいjs.erbファイルがあります。これは、次のようなビューに含まれています。

<%= javascript_include_tag "resources/gallery_resource" %>

これは、アセットパスが自己完結している間は正常に機能しますが、アセットパス内のコントローラー(@resource)で定義された変数を使用する必要があります。

element.image = "<%= asset_path 'resources/galleries/'+@resource.uid+'/'+index+'.jpg' %>"

@resourceの問題は定義されていません。では、コントローラーにアクセスできない場合、このRubyコードの範囲はどのようになりますか?そして、ここで変数を使用可能にするにはどうすればよいですか?

変数をJavascriptにアクセスできるようにする方法は理解していますが、埋め込まれたRubyで使用できるようにしたいと思います。

4

2 に答える 2

1

パーシャルとしてレンダリングし、リソースをローカルとして渡す必要があります。

<script>
  <%= render :partial => 'resources/gallery_resource', :locals => { :resource => @resource } %>
</script>

また、gallery_resource.js.erbファイルで、@resourceを単なるリソースに変更する必要があります。

element.image = "<%= asset_path 'resources/galleries/'+resource.uid+'/'+index+'.jpg' %>"

これが他のアクションでレンダリングされる場合は、:localsハッシュで:resource値を渡す必要もあります。

js.erbファイルのスコープは、いくつかの点によって異なります。

  • コントローラ自体がファイルをレンダリングしている場合、コントローラはインスタンス変数('@resource'など)にアクセスできます。これは、views / viewtype / show.js.erbが存在し、ブラウザーがjs応答タイプを要求した場合に当てはまります。.html.erbファイルの場合と同じです。
  • パーシャルとしてレンダリングされている場合、唯一のスコープは:localsハッシュで渡すものです。これらはインスタンス変数ではなくローカル変数であるため、そのように参照されます(「リソース」など)。
  • 一方、javascript_include_tagを使用すると、JSファイルを直接参照するタグがHTMLに作成されます。可変ではないJavaScriptを含める必要がある場合は、これで問題ありません。これらは、app /Assets/ディレクトリまたはpublic/ディレクトリの下のどこかにある必要があります。

app /assetsまたはpublic/にあるファイルは、個々のリクエストの変数にアクセスできません。コンパイルされない(public /)か、一度だけプリコンパイルされる(app / Assets)かのどちらかです

おそらく、問題のファイルは現在、app/assetsディレクトリにあります。部分的にレンダリングするには、views /ディレクトリの下のどこかに移動し、名前の前にアンダースコア(_)を付けます。

app/views/resources/_gallery_resource.js.erb
于 2012-11-08T11:05:05.060 に答える
1

記録として、この問題に対する私の解決策は、トークンを使用してベースパスを取得することでした。

var base_path = "<%= asset_path 'resources/galleries/{{X}}.jpg' %>";

次に、優れたgongemを使用して使用可能にしたコントローラー変数を使用してトークンを置き換えます

var imagePathFragment = gon.resource.uid+'/'+(index+1);
element.image = base_path.replace('{{X}}', imagePathFragment);
于 2012-11-08T12:18:18.783 に答える