2010-07-15 6 views

Répondre

5

Si je comprends bien votre besoin, vous voulez que le code Javascript apparaisse dans vos vues pour avoir accès aux routes nommées. Si oui, alors une façon simple de le faire est de rendre votre code Javascript dans un modèle (ERB, Haml, etc.), puis d'élargir les routes quelque chose comme ce qui suit:

ERB:

<script> 

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

    }); 

</script> 

Haml:

:javascript 

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

    }); 

MISE à JOUR: Ajout des suggestions pour public/javascripts/ cas

Accès routes nommées dans le dossier public est un peu plus compliqué mais au moins 2 façons qui viennent à l'esprit, ni qui est tout à fait satisfaisant, mais, un ou deux qui pourraient convenir à votre application

  1. Créer javascript modèles dans (par exemple) lib/javascripts en utilisant ERB nommé comme '*.js.erb' et une tâche rake pour étendre ces modèles en public/javascript s avant le déploiement (disons comme une étape dans votre recette Capistrano par exemple). L'inconvénient de cela est que vos changements ne sont pas disponibles en direct sur le site jusqu'à ce que les modèles sont développés et vous ne pourriez pas obtenir la bonne syntaxe de votre javascript avec un fichier d'extension .erb
  2. Créer des fonctions auxiliaires javascript dans un content_for :head bloc qui développe les routes nommées et rend celles disponibles pour le code de vos fichiers javascript publics. Si vous êtes prudent avec les espaces de noms et les conventions, cela pourrait bien fonctionner. L'inconvénient est que le code appelant ces helpers javascript est découplé du code qui les définit, ce qui pourrait être déroutant pour les mainteneurs ou sujettes à des abus.

Dans certains Vue:

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

Puis, en public/application.js (par exemple)

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

}); 
+0

Merci pour votre aide. Mais si je veux y accéder dans mes fichiers publics/javascript, comment puis-je y accéder? – kishore

-1

Voir http://tore.darell.no/pages/javascript_routes:

JavascriptRoutes convertit vos itinéraires Rails en JavaScript. Vous pouvez ensuite les accéder (les générer) dans le navigateur (ou dans tout autre environnement JS). Il prend en charge les routes normales et nommées, et crée des fonctions auxiliaires pour ce dernier.

Mise à jour: Il semble que quelqu'un a bifurqué si vous préférez jQuery: https://github.com/ajnsit/javascript_routes

39

je faisais des recherches à cette question pendant un certain temps et n'a pas trouvé une application compatible avec Rails 3.

donc décidé d'écrire mon propre:

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

+2

Cela devrait être roulé dans des rails, exactement ce que je cherchais. – opsb

3

bjg a répondu vraiment, mais je pensais que je serais extraire la partie pertinente et amplifient un exemple.

Vous donnez simplement à votre vue une variable chaîne dont la valeur est un chemin Rails nommé, puis utilisez cette valeur dans le Javascript de votre formulaire. Un exemple qui illustre comment une méthode de commande peut spécifier le chemin d'une autre méthode, qui sera ouverte par le script sur la simple pression d'un bouton:

fichier config/routes.rb:

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

commandant rake routes produira maintenant, parmi autre sortie, ceci:

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

foo_reset_path est ce que nous allons utiliser ici, mais vous pouvez bien sûr utiliser cette méthode avec un chemin Rails nommé.

fichier 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 

fichier 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> 

J'utilise JQuery, mais l'idée de base doit être claire. Le script ajoute un point d'ancrage à l'élément de bouton dont l'ID est reset_button, de sorte qu'un clic sur le bouton provoque l'appel de la méthode reset de foo_controller.

20

Kishore Je pense que c'est la façon plus simple, il suffit d'appeler:

Rails.application.routes.url_helpers * _ chemin

Donc, si vous avez dans votre routes.rb, nous allons. dire:

ressources: les utilisateurs

alors que vous voulez appeler l'action d'index à partir d'un fichier javascript, vous:

Prenez en compte que le fichier js doit avoir une extension .erb (ou * .js.erb) si rails sait que doit être prétraité. Sinon, le fichier sera servi tel quel.

1

Ce que je ne basé sur une grande réponse de Teemu:

Dans votre contrôleur:

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

À votre avis:

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

Dans votre 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. gem install les "angular_rails_templates"
  2. Créer un fichier appelé angular_rails_templates.rb dans le dossier config/initializers
  3. copie code suivant dans le fichier et redémarrez le serveur. (Y compris "module CustomERBEngine", car il ne peut pas être ajouté au bloc de code par 4 espace)

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'