web-dev-qa-db-ja.com

JavaScriptアセット内でRailsヘルパーメソッドを使用する

Railsヘルパーメソッド、より具体的には、javascriptアセットファイル内のパスヘルパーメソッドを使用する方法はありますか。このファイルfoo.js.coffee.erb

$('#bar').val("<%= create_post_path %>")

エルビスからもらえたらいいな

$('#bar').val("path/to/create")
69
axsuul

以下を使用して、erbテンプレートに任意のヘルパー/モジュール/クラスを含めることができます。

<% environment.context_class.instance_eval { include MyHelper } %>

参照: https://github.com/Rails/sprockets/blob/master/lib/sprockets/environment.rb および https://github.com/Rails/sprockets/blob /master/lib/sprockets/context.rb

URLヘルパーを使用するには、特定のアプリケーションのヘルパーを含める必要があります。

それらはRails.application.routes.url_helpers そう:

<% environment.context_class.instance_eval { include Rails.application.routes.url_helpers } %>

編集:移動したスプロケットリポジトリへのリンクを修正しましたが、これが何年も後に意味をなすかどうかは確かではありません。

74
eirc

これは初期化子でもトリックを行います:

_Sprockets::Context.send :include, MyHelper
_

開発モードでは、ヘルパーはリクエストごとにリロードされません。

UrlHelpersを使用したアプローチは、post_path(...um...we don't know what post id we'll need at compile time...)を見つけるまで必要です。 JavaScriptですべてのRuby UrlHelpersを再実装するRails gemがあります。 https://github.com/railsware/js-routes

25
user1158559

なぜあなたがこれをしたいのか、私にはよくわかりません。

  • 動的な値が含まれているため、javascriptファイルがキャッシュされないようにします

  • Javascript/coffeescriptとRailsの間のカップリングを取得します

可能であれば、ビューにターゲットパスを指定して問題を抽象化し、特定のイベントが発生したときにDOM要素から値を取得することをお勧めします。 Rails do。の「控えめなスクリプトアダプター」と同じです。例: https://github.com/Rails/jquery-ujs/blob/master/src/Rails.js# L157-17

19
topek

実際、@ eircの回答に同意します(Sprocketsのドキュメントを考慮に入れる)。しかし、Railsブート時間にヘルパーモジュールを含めることを検討します。

# config/initializers/sprockets.rb
Rails.application.assets.context_class.instance_eval do
  include ActionView::Helpers
  include Rails.application.routes.url_helpers
  include MyModule
end

これは次の理由によります。 https://github.com/Rails/sprockets-Rails/blob/master/lib/sprockets/railtie.rb#L2

8
Andrea Amantini

実際、これが役立つかどうかはわかりませんが、rake precompile中に使用する独自のヘルパーを定義する方法があります

新しい初期化子を作成して、これを入れます:

module Sprockets
  module Helpers
    module RailsHelper

      def my_helper_method
       ...
      end

    end
  end
end

そして、次のことができます。

<%= my_helper_method %>

.erbアセット内

5
Matthew