Using a Rails helper method within a javascript asset

前端 未结 5 2187
长发绾君心
长发绾君心 2020-11-28 03:13

Is there any way to use a Rails helper method, more specifically, a path helper method within a javascript asset file. This file foo.js.coffee.erb



        
相关标签:
5条回答
  • 2020-11-28 03:28

    Actually, not sure if this helps but there is a way to define your own helpers for use during rake precompile

    Create a new initializer and put this in it:

    module Sprockets
      module Helpers
        module RailsHelper
    
          def my_helper_method
           ...
          end
    
        end
      end
    end
    

    And then you can:

    <%= my_helper_method %>
    

    in your .erb assets

    0 讨论(0)
  • 2020-11-28 03:29

    This will also do the trick in an initializer:

    Sprockets::Context.send :include, MyHelper
    

    In development mode the helper will not be reloaded on every request.

    Your approach with UrlHelpers will work until you need to find post_path(...um...we don't know what post id we'll need at compile time...). There is a ruby gem which reimplements all of your Rails UrlHelpers in JavaScript: https://github.com/railsware/js-routes

    0 讨论(0)
  • 2020-11-28 03:31

    Indeed I agree with @eirc answer (taking into account Sprockets documentation). But I would consider including helper modules at rails boot time. As per

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

    this is because of: https://github.com/rails/sprockets-rails/blob/master/lib/sprockets/railtie.rb#L23

    0 讨论(0)
  • 2020-11-28 03:36

    I'm not quite sure, why you want to do this.

    • You would prevent the javascript file from being cached, as it contains a dynamic value

    • You would get a coupling between your javascript/coffeescript and rails

    If possible I would advice you to abstract your problem away by providing your target path in the view and retrieve the value from the DOM-Element when the specific event occurs. Just like 'Unobtrusive Scripting Adapters' for Rails do. E.g.: https://github.com/rails/jquery-ujs/blob/master/src/rails.js#L157-173

    0 讨论(0)
  • 2020-11-28 03:37

    You can include any helper/module/class in an erb template with:

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

    See: https://github.com/rails/sprockets/blob/master/lib/sprockets/environment.rb and https://github.com/rails/sprockets/blob/master/lib/sprockets/context.rb

    To use the url helpers you have to include your specific applications' helpers.

    They are available at Rails.application.routes.url_helpers so:

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

    EDIT: Fixed links to moved sprockets repo but not really sure this still makes sense so many years later.

    0 讨论(0)
提交回复
热议问题