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 :

Polymorphisme rails 2.38


Sujet :

Ruby on Rails

  1. #1
    Membre habitué
    Inscrit en
    Février 2004
    Messages
    279
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 279
    Points : 164
    Points
    164
    Par défaut Polymorphisme rails 2.38
    Bonsoir,

    J'ai bien regarde la video sur Railscasts sur le polymorphisme, mais a vrai dire je ne comprends pas comment obtenir une liste de tous les commentaires et savoir a quelle table ils appartiennent (soit le commentaire appartient a un article soit a un events)

    Je souhaite avoir une liste de comments comme par exemple les derniers commentaires du site, et que l'on puisse cliquer dessus afin de tomber sur la bonne page.

    Est-ce vraiment possible?

    merci pour votre aide

    ++sand

  2. #2
    Membre averti Avatar de Gregory.M
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    684
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 684
    Points : 309
    Points
    309
    Par défaut
    Citation Envoyé par speed034 Voir le message
    Bonsoir,

    J'ai bien regarde la video sur Railscasts sur le polymorphisme, mais a vrai dire je ne comprends pas comment obtenir une liste de tous les commentaires et savoir a quelle table ils appartiennent (soit le commentaire appartient a un article soit a un events)

    Je souhaite avoir une liste de comments comme par exemple les derniers commentaires du site, et que l'on puisse cliquer dessus afin de tomber sur la bonne page.

    Est-ce vraiment possible?

    merci pour votre aide

    ++sand

    Rails ne le fait pas pour toi, tu dois le faire toi même. Pour savoir à qui appartient un commentaire tu peux faire comme ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    def truc
      if commentable_type == "article"
         //tu récuperes les commentaires avec un named_scope
      end
    end
    ou, un autre moyen

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
       def truc
          if self.respond_to?(:article)
            self.article.comments // Mais ca fait faire 2 requêtes SQL
          end
       end

  3. #3
    Membre habitué
    Inscrit en
    Février 2004
    Messages
    279
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 279
    Points : 164
    Points
    164
    Par défaut
    Merci


    Par desespoir jai cree une fonction dans mon helpers et ca donne quelque chose comme ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     def link_to_target(commentable_type, commentable_id, text)  
        case commentable_type
        when 'Album' 
           album = Album.find(commentable_id) 
           link_to truncate(text, :length => 36), artist_album_path(album.artist, album), :title => text,:target => '_blank' 
        when 'Genre' 
           genre = Genre.find(commentable_id)
           link_to truncate(text, :length => 36), genre_url(genre),:target => '_blank' 
    ...
    Est-ce bien propre?

    Merci

  4. #4
    Membre averti Avatar de Javix
    Inscrit en
    Juin 2007
    Messages
    531
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 531
    Points : 353
    Points
    353
    Par défaut
    Tu peux trouver le type de ton modèle comme ça dans un controlleur en question:
    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
     
    #dans ServicesController
    class ServicesController < ApplicationController
      before_filter :find_client      
    def find_client    
        params.each do |name, value|
          if name =~ /(.+)_id$/        
            @client = $1.classify.constantize.find(value)
            return @client
          end
        end
        nil
      end
     
    end
    J'ai utilisé cette approche pour créer un service pour un type des clients (personne physique, entreprise, etc.).
    Puis dans la partial des Services je faisait l'appel au service du client:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ....
    td><%= link_to t("menu.edit"), edit_polymorphic_url([service.client, service]) %></td>
    <td><%= link_to t("menu.destroy"), polymorphic_url([service.client, service]), :confirm => t("menu.before_destroy_dialog", :item => service.class.human_name), :method => :delete %></td>
    ...
    Et les modèles étaient définis comme ça:
    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
     
    class Enterprise < ActiveRecord::Base
      has_many :services, :as => :client, :dependent => :destroy  
    ...
    end
     
    class PhysicalPerson < ActiveRecord::Base
      has_many :services, :as => :client, :dependent => :destroy
    ...
    end
     
    class Service < ActiveRecord::Base
      belongs_to :client, :polymorphic => true
    ...
    end
    Je rajoutais les services à un client via show page dans Enterprises ou Physical Person:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ..#tu affiche ce que tu veux ici pour Entreprise, par exemple...
    <p>
      <%= link_to t("client.titles.add_service"), new_polymorphic_url([@enterprise, :service]) %> |
      <%= link_to t("menu.list_all"), enterprises_path %>
    </p>
    Dans les routes - rien de spécial:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ....
    map.resources :enterprises, :has_many=> :services
      map.resources :physical_people, :has_many=> :services
    ...
    J'espère ça peut t'aider;

  5. #5
    Membre habitué
    Inscrit en
    Février 2004
    Messages
    279
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 279
    Points : 164
    Points
    164
    Par défaut
    Yes je vois la fonction et je la comprends.
    Je ne sais juste pas quand exactement l'utiliser.

    Dans la view?

    On fait par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    -@users.each do |user|
      =user.find_client
    Merci

  6. #6
    Membre averti Avatar de Javix
    Inscrit en
    Juin 2007
    Messages
    531
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 531
    Points : 353
    Points
    353
    Par défaut
    Mais, non. La view ne sert qu'à afficher les données qui proviennent de controller, - c'est ça le pattern MVC.
    En plus, si tu n'as pas remarqué, la méthode est appelée dans ton controller via 'before_filter'. Ce qui veut dire - à chaque appelle d'une des méthodes du controller si c'est pas précisé autrement via les options 'except ou 'only'.

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

Discussions similaires

  1. polymorphisme et autre
    Par jbeauport dans le forum C++
    Réponses: 15
    Dernier message: 29/06/2005, 14h43
  2. [Language] polymorphisme, interface ...
    Par Ikit dans le forum Langage
    Réponses: 5
    Dernier message: 03/03/2005, 12h39
  3. Réponses: 15
    Dernier message: 25/01/2005, 17h51
  4. Surcharge et Polymorphisme
    Par Hell dans le forum C++
    Réponses: 6
    Dernier message: 12/01/2005, 21h50
  5. Réponses: 2
    Dernier message: 26/07/2004, 00h24

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