2010-07-15 13 views

Respuesta

5

Si entiendo correctamente su requisito, quiere que el código de Javascript en sus vistas tenga acceso a las rutas nombradas. Si es así, entonces una forma sencilla de hacer esto es hacer que el código JavaScript a través de una plantilla (ERB, Haml, etc) y luego expandir las rutas algo como lo siguiente:

ERB:

<script> 

    $.get('<%= some_named_route_path %>', function(data) { 

    }); 

</script> 

Haml:

:javascript 

    $.get('#{ some_named_route_path }', function(data) { 

    }); 

ACTUALIZACIÓN: La adición de sugerencias para public/javascripts/ caso

Acceso a rutas con nombre de la carpeta pública es un poco más complicado pero hay al menos 2 formas que vienen a la mente, ninguno de los cuales es del todo satisfactorio, pero, uno o ambos de los cuales pueden adaptarse a su aplicación

  1. crear Javascript plantillas en (por ejemplo) lib/javascripts utilizando ERB llamado como '*.js.erb' y una tarea rake para expandir esas plantillas a public/javascript s antes de implementar (digamos como un paso en su receta Capistrano, por ejemplo). La desventaja de esto es que sus cambios no están disponibles en vivo en el sitio hasta que las plantillas se expandan y no obtenga el resaltado de sintaxis correcto de su javascript con un archivo de extensión .erb
  2. Cree funciones de ayuda de javascript en un content_for :head bloque que expande las rutas nombradas y las pone a disposición del código de sus archivos javascript públicos. Si tiene cuidado con el espaciado de nombres y las convenciones, esto podría funcionar bien. La desventaja es que el código que llama a estos ayudantes de JavaScript está desacoplado del código que los define, lo que podría ser confuso para los responsables de mantenimiento o propensos al abuso.

En algún punto de vista:

<% content_for :head do %> 
    <script> 
    SomeNameSpace.helper_to_some_named_route = function() { 
     return '%<= some_named_route_path %> 
    }; 
    </script> 
<% end %> 

Luego, en public/application.js (digamos)

$.get(SomeNameSpace.helper_to_some_named_route(), function(data) { 

}); 
+0

Gracias por su ayuda. Pero si quiero acceder a ellos en mis archivos públicos/javascript, ¿cómo puedo acceder a ellos? – kishore

39

yo estaba investigando esta cuestión durante un tiempo y no ha encontrado ninguna aplicación compatible con Rails 3.

Así que decidí escribir mi propia:

https://github.com/railsware/js-routes

+2

Esto debería enrollarse en rieles, exactamente lo que estaba buscando. – opsb

3

bjg realmente respondió esto, pero pensé que me gustaría extraer la parte pertinente y amplificar con un ejemplo.

Simplemente proporcione a su vista una variable de cadena cuyo valor sea una ruta de Rails con nombre, y luego use ese valor en el Javascript de su formulario. Un ejemplo que ilustra cómo un método controlador puede especificar la ruta de otro método, al ser abierto por el script en la prensa de un botón:

Archivo config/routes.rb:

... 
resource :foo, :only => [:show, :reset] 
... 
match 'foo_reset_path' => 'foo#reset' 

Al mando rake routes ahora producirá, entre otra salida, esto:

foo    GET /foo(.:format)   foo#show 
foo_reset_path  /foo_reset_path(.:format) foo#reset 

foo_reset_path es lo que vamos a utilizar aquí, pero por supuesto puede utilizar este método con cualquier camino carriles llamada.

Archivo app/controllers/foo_controller.rb:

... 
def show 
    @reset_path = "foo_reset_path" # simply the string you'd use in the 
           # Rails code for opening the path 
    ... 
end 
... 
def reset 
    ... # reset some variables to their default values 
    redirect_to foo_path # causes the show method to be called, and the HTML 
         # page to be redisplayed 
end 

Archivo app/views/foo/show.html.erb:

... 
<input type="hidden" id="reset_path" name="reset_path" value="<%= @reset_path %>"> 
... 
<script> 
$(document).ready(function() { 
    ... 
    /* Hang functionality on the "Reset form" button. */ 
    $('#reset_button').click(function() { 
     var reset_path = $('#reset_path').val(); 
     window.open(reset_path, "_self") 
    }); 
    ... 
}) 
</script> 

estoy usando jQuery aquí, pero la idea básica debe ser clara. La secuencia de comandos agrega un gancho al elemento de botón cuyo ID es reset_button, por lo que al hacer clic en el botón se llama al método reset de foo_controller.

20

Kishore Creo que esta es la manera más simple, simplemente llame a:

Rails.application.routes.url_helpers * _ ruta

lo tanto, si usted tiene en su routes.rb, vamos. decir:

recursos: usuarios

A continuación, desea llamar a la acción index de un archivo JavaScript, que hace:

Tener en cuenta que el archivo js debe tener una extensión .erb (o * .js.erb) para rieles sabe que deber ser preprocesado De lo contrario, el archivo se servirá tal cual.

1

Lo que hice basado en la gran respuesta de Teemu:

En su controlador:

def show 
    @section = Section.find(params[:id]) 
    respond_to do |format| 
    format.html 
    format.json { render json: @section} 
    end 
end 

En su opinión:

<input type="hidden" id="section_path" data-path="<%= @section.id %>" name="section_path" value="foo"> 

En sus JS:

var id = $('#section_path').attr('data-path'); 

$.ajax({ 
    url:'/sections/'+ id +'.json', 
    type:"GET", 
    success: function (data){ 
     console.info(data); 
    }, 
    error: function (xhr, status){ 
     console.info(xhr.error); 
    } 
}); 
-2
  1. joya instalar los "angular_rails_templates"
  2. Crear un archivo llamado angular_rails_templates.rb en el config/inicializadores carpeta
  3. copia siguiente código en el archivo y reinicie el servidor. (Incluyendo "CustomERBEngine módulo" para que no se puede añadir a bloque de código por 4 espacio)

module CustomERBEngine

class ERBTemplate < Tilt::ERBTemplate 

def evaluate(scope, locals, &block) 
    scope.class_eval do 
    include Rails.application.routes.url_helpers 
    include Rails.application.routes.mounted_helpers 
    include ActionView::Helpers 
    end 
     super 
    end 
    end 
end 

Tilt.register CustomERBEngine::ERBTemplate, '.erb' 
Cuestiones relacionadas