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 :

méthode avec paramètre


Sujet :

Ruby on Rails

  1. #1
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 497
    Points : 12 600
    Points
    12 600
    Par défaut méthode avec paramètre
    bonjour, j'ai le contrôleur suivant

    Code contrôleur : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    class MotSimpleController < ApplicationController
     
      def index 
        flash[:notice]=''
        @mots = DbProjet.find_by_sql("SELECT * FROM `motsphrase` ORDER BY RAND() LIMIT 1")
     
      end
     
      def reponse(motSelect)
     
        flash[:notice]='Où suis-je ?'
        @mots = DbProjet.find_by_sql('SELECT * FROM `motsphrase` WHERE reponse <> #{motSelect} + "ORDER BY RAND() LIMIT 6')
      end
    end

    et quand je passe une url de ce genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    mot_simple/reponse/poisson
    il me répond qu'il me manque un paramètre????????????


    Merci de votre aide.

  2. #2
    Membre émérite
    Avatar de bolo
    Inscrit en
    Novembre 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 309
    Points : 2 695
    Points
    2 695
    Par défaut
    Je ne crois qu'on puisse faire ca en tout ca des méthode public
    il faut que tu utilises params[:motSelect]

  3. #3
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 497
    Points : 12 600
    Points
    12 600
    Par défaut
    Merci pour la piste.

    La soluce

    Code contrôleur : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    def reponse
        mot = params[:id]
        flash[:notice]='Où suis-je ?'
        @mots = DbProjet.find_by_sql("SELECT * FROM `motsphrase` WHERE reponse <>'#{mot}' ORDER BY RAND() LIMIT 6")
      end

  4. #4
    Membre émérite
    Avatar de bolo
    Inscrit en
    Novembre 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 309
    Points : 2 695
    Points
    2 695
    Par défaut
    je suis pas super fan find_by_sql. tu devrais faire autrement
    @mots = DbProjet.find_by_sql("SELECT * FROM `motsphrase` WHERE reponse <>'#{mot}' ORDER BY RAND() LIMIT 6")
    je nais pas comment est ton model mais tu dois pouvoir arriver a faire qqch comme ca ? (Non testé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    DbProjet.find( :all, :limit => 6 , :conditions => ['reponse <> ', params[:mot]])

  5. #5
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 497
    Points : 12 600
    Points
    12 600
    Par défaut
    Le find_by_sql à certain avantages, comme ne pas apprendre tout le temps une syntaxe différente.


    Mais pour la beauté du langage voici la solution (testé)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    @mots = DbProjet.find( :all,  :conditions => :reponse != params[:id],:order => "RAND()",:limit => 5)
    J'ai eu un peu de difficulté avec la condition.

    en sql différent c'est <> , en langage de programmation != .

    Et puis je récupère directement la params[:id], ce qui est pas mal

  6. #6
    Membre émérite
    Avatar de bolo
    Inscrit en
    Novembre 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 309
    Points : 2 695
    Points
    2 695
    Par défaut
    c'est surtout un problème au niveau de la sécurité

  7. #7
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 497
    Points : 12 600
    Points
    12 600
    Par défaut
    Citation Envoyé par bolo
    c'est surtout un problème au niveau de la sécurité
    tu penses qu'il est plus facile de faire l'injection sql avec un find_by_sql?

  8. #8
    Membre émérite
    Avatar de bolo
    Inscrit en
    Novembre 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 309
    Points : 2 695
    Points
    2 695
    Par défaut
    d'apres lecture oui, ActiveRecord te protèges de cela. Il faut utilisé find_by_sql en dernier quand les assos ne sont plus suffisantes

  9. #9
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    657
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 657
    Points : 910
    Points
    910
    Par défaut
    Citation Envoyé par MaitrePylos
    tu penses qu'il est plus facile de faire l'injection sql avec un find_by_sql?
    Ca dépend en fait
    Si tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @mots = DbProjet.find_by_sql("SELECT * FROM `motsphrase` WHERE reponse <> '#{mot}' ORDER BY RAND() LIMIT 6")
    Il n'y aucun échappement effectué et il y a un risque d'injection SQL au niveau de la variable mot (qui est collée directement dans la requête sans vérification).

    En revanche tu peux échapper ta requête en fesant comme avec un find classique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @mots = DbProjet.find_by_sql(["SELECT * FROM `motsphrase` WHERE reponse <> ? ORDER BY RAND() LIMIT 6", mot])
    Auquel cas la variable sera échappée si nécessaire par ActiveRecord

  10. #10
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 497
    Points : 12 600
    Points
    12 600
    Par défaut
    Citation Envoyé par Taum
    Auquel cas la variable sera échappée si nécessaire par ActiveRecord
    Et bien voila

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

Discussions similaires

  1. javascript vers java (méthodes avec paramètres)
    Par knice dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 16/08/2008, 21h42
  2. Réponses: 3
    Dernier message: 22/07/2008, 17h26
  3. Réponses: 0
    Dernier message: 22/07/2008, 11h28
  4. Réponses: 1
    Dernier message: 28/01/2008, 14h49
  5. appeler une méthode avec paramètre dans une page JSP
    Par javasmif dans le forum Struts 2
    Réponses: 1
    Dernier message: 06/12/2007, 10h48

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