63

¿Hay alguna forma de utilizar un método de ayuda de Rails, más específicamente, un método de ayuda de ruta dentro de un archivo de activos de JavaScript. Este archivo foo.js.coffee.erbUso de un método de ayuda Rails en un activo de JavaScript

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

Me encantaría que si podía obtener de erubis

$('#bar').val("path/to/create") 
+0

¿Ha tratado de hacer esto? Deberia de funcionar. – natedavisolds

+1

Sí, lo he probado, da "variable o método local indefinido". He intentado con otros métodos, como ... number_to_currency – axsuul

+0

Me gustaría señalar que este método de ayuda SIEMPRE funciona: javscript_path ('path/to/js') – axsuul

Respuesta

68

Usted puede incluir cualquier/módulo/clase de ayuda en una plantilla erb con:

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

Ver: https://github.com/rails/sprockets/blob/master/lib/sprockets/environment.rb y https://github.com/rails/sprockets/blob/master/lib/sprockets/context.rb

Para utilizar los ayudantes de URL que tiene que incluir ayudantes sus aplicaciones específicas.

Ellos están disponibles en Rails.application.routes.url_helpers modo:

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

EDIT: enlaces fijos a las ruedas dentadas movidas Repo pero no realmente seguro de que esto todavía tiene sentido después de tantos años.

+0

Pero, ¿cómo incluiría el módulo UrlHelpers? Y lo malo es que los usuarios de url necesitan un modelo en tiempo de ejecución, buy-buy cowboy –

+14

Para usar los helpers de url, debes incluir los helpers de tus aplicaciones específicas. Están disponibles en 'Rails.application.routes.url_helpers' así que: ' <% environment.context_class.instance_eval {include Rails.application.routes.url_helpers}%> ' – eirc

+3

¡Fantástica respuesta! ¿Cómo resolviste esto? ¿Está presente en Rails Guides? Pensé que tal vez vi algo similar en un RailsCast, esta magia es tan poderosa, ¡tienes que decirme hombre! – jlstr

18

No estoy muy seguro, ¿por qué quieres hacer esto.

  • Se podría evitar que el archivo JavaScript de ser cacheada, ya que contiene un valor dinámico

  • Se podría conseguir un acoplamiento entre su javascript/CoffeeScript y rieles

Si es posible le aconsejaría que resuma su problema al proporcionar su ruta de destino en la vista y recuperar el valor del elemento DOM cuando se produce el evento específico. Al igual que los "discretos adaptadores de scripting" para Rails do. Por ejemplo: https://github.com/rails/jquery-ujs/blob/master/src/rails.js#L157-173

+0

Sí, gracias por la sugerencia. – axsuul

+19

esto no evitaría el almacenamiento en caché. los activos se compilan en la implementación y nunca cambian esa ruta no cambia (a menos que realmente lo haga y los activos se vuelvan a compilar). Esto es particularmente útil si, por ejemplo, quieres usar una ruta de imagen en tu JS alojada desde tu 'asset_path ' – brad

+4

Como se mencionó anteriormente, no me gustaría hacer esto, ya que introduce el acoplamiento entre su aplicación y su JavaScript. Cada parte de tu aplicación debe servir para un propósito diferente. No querría que su vista tuviera lógica de modelo y personalmente no quiero que el código de Rails se filtre en mi JavaScript. Por supuesto, esta es una especie de preferencia personal. JavaScript tiene muchas posibilidades de recuperar información del DOM sin que se le inyecte directamente. No querrá codificar estos valores de forma rígida. Entonces, ¿por qué sería mejor tener un ayudante que haga esto por ti? – topek

5

En realidad, no estoy seguro si esto ayuda, pero hay una manera de definir sus propios ayudantes para su uso durante rake precompile

Crear un nuevo inicializador y poner esto en él:

module Sprockets 
    module Helpers 
    module RailsHelper 

     def my_helper_method 
     ... 
     end 

    end 
    end 
end 

Y a continuación, se puede:

<%= my_helper_method %> 

en sus .erb activos

25

Esto también hará el truco en un inicializador:

Sprockets::Context.send :include, MyHelper 

En el modo de desarrollo del ayudante no se vuelve a cargar en cada petición.

Su enfoque con UrlHelpers funcionará hasta que necesite encontrar post_path(...um...we don't know what post id we'll need at compile time...). Hay una gema de rubí que reimplementa todos los Rails UrlHelpers en JavaScript: https://github.com/railsware/js-routes

+0

¡Esta es la solución menos intrusiva, gracias! – Casey

+1

Tuve que agregar una railtie a mi archivo application.rb ya que estaba usando config.assets.initialize_on_precompile = false. https://stackoverflow.com/questions/9235292/how-can-i-run-some-initializers-when-doing-a-rails-assetsprecompile/12700183#12700183 on cómo configurar la railtie. – HannesBenson

+0

Esto funcionó para mí, gracias. –

8

De hecho, estoy de acuerdo con @eirc answer (teniendo en cuenta la documentación de Sprockets). Pero me gustaría considerar incluir módulos auxiliares en el tiempo de arranque de los rieles.Según

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

esto es debido a: https://github.com/rails/sprockets-rails/blob/master/lib/sprockets/railtie.rb#L23

Cuestiones relacionadas