IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Ruby on Rails Discussion :

Traitement de requête GET dans un Controlleur sans changer de vue.


Sujet :

Ruby on Rails

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 36
    Points : 31
    Points
    31
    Par défaut Traitement de requête GET dans un Controlleur sans changer de vue.
    Bonjour,
    J'ai mélangé mon code ruby à une bibliothèque javascript pour me faire un bel album photo. Alors en amont tout se passe bien mais pour l'agrandissement d'une image, je suis obligé de passer par une requête de type GET. J'aimerais que le Controller, qui affiche l'album récupère cette requête parce qu'il doit effectuer un traitement avant l'affichage sur la même vue. Pour l'affichage je règle le problème avec une solution de type flash.now.
    Pour récupérer ma requête je pense à un code du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if requete.get?
    url=requete.uri_string
    traitement (url)
    ....
    Mais ma requête arrivant par l'adresse www.mondomaine.com/album/photo/IMG012.jpg me renvoie l'erreur classique:
    No route matches "/album/photo/IMG012.jpg" with {:method=>:get}
    Or je voudrais non seulement que ma page ne se recharge pas mais également pouvoir traiter la requête. Je sais qu'il faut que je paramètre route.rb mais je commence à tourner en rond.
    Je précise que mon controller se nomme album et l'action photo.
    Les solutions du type link_to ou <a href=....></a> ne fonctionne pas et font planter le script java que je renonce a réécrire vu qu'il n'est pas de moi.
    Merci de vous intéresser a mon problème.
    Cordialement,
    Olivier

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 36
    Points : 31
    Points
    31
    Par défaut solution
    Bon, j'ai trouvé la solution: laisser tomber le get pour un post et le résultat de la fonction javascript se gère donc comme un formulaire! A noter que ça ne passe pas si dans la classe on ne met pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    protect_from_forgery :only => [:create, :update, :destroy]
    problème d'authenticité.

    Je suis sympa je donne le code javascript, ça pourra peut-être aider qelqu'un:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    onClick:            function() { 
     
    		  method = "post"; // Set method to post by default, if not specified.
     
    		  // The rest of this code assumes you are not using a library.
    		  // It can be made less wordy if you use one.
    		  var form = document.createElement("form");
    		  form.setAttribute("method", method);
    		  form.setAttribute("action", "/album/photo");
     
     
    		    var hiddenField = document.createElement("input");
    		    hiddenField.setAttribute("type", "hidden");
    		    hiddenField.setAttribute("name", "bigger");
    		    hiddenField.setAttribute("value", this.url);
     
    		    form.appendChild(hiddenField);
     
     
    		  document.body.appendChild(form);
    		  form.submit();
    		},   /* Onclick behaviour */

  3. #3
    Membre éclairé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 510
    Points : 652
    Points
    652
    Par défaut
    Bonjour,

    Je me permets d'intervenir pour faire quelques remarques négatives sur ta solution. En modifiant les routes, tu perds le côté Restful de ton appli, c'est dommage. En modifiant le protect_from_forgery, tu ouvres un beau trou de sécurité. Ton javascript obstrusif à mort n'est pas du tout conseillé.
    En résumé, on est loin des bonnes pratiques.

    Pour faire ce que tu cherches à faire : "Afficher une photo sans recharger la page" tu peux le faire avec Ajax (:remote => true). Tu peux utiliser la même méthode "show" en spécifiant dans ton contrôleur le format de sortie (html ou js) selon le cas.

    Pour les traitements, je te conseille de les faire AVANT (Préparer 2 ou 3 photos de taille différente, prêtes à être affichées, et ne pas solliciter le serveur, lorsque l'appli est déployée)
    Tu peux t'inspirer de cette solution par exemple :
    http://rhotoalbum.rubyforge.org/

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 36
    Points : 31
    Points
    31
    Par défaut
    Merci pour la remarque, je vais regarder tout ça de près. Sinon, l'appli n'est pas destinée à une usage massif mais pour moi et ma copine. Cela dit, merci.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 12/06/2013, 15h26
  2. Réponses: 1
    Dernier message: 30/04/2013, 01h05
  3. Réponses: 4
    Dernier message: 13/03/2011, 19h54
  4. Réponses: 8
    Dernier message: 27/12/2010, 18h08
  5. Requête GET ou POST sans formulaire.
    Par etiennegaloup dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 31/10/2005, 10h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo