2009-09-04 12 views
0

J'ai un modèle d'utilisateur et un modèle de profil.Question d'URL amicale, avec un Twist

user has_one :profile profile belongs_to :user

En raison de cette relation, je tire mes profils en appelant l'ID utilisateur. Donc, mes URL ressemblent à ceci: website.com/users/[user_id]/profile

Je ne suis pas sûr s'il y a une solution à mon problème. Le voici: Je voudrais afficher des URL conviviales SEO. Je cherche à utiliser friendly_id pour cela. Mais, nos profils sont pour les entreprises, et c'est le nom de l'entreprise que nous voulons mettre dans l'url. Le problème est que notre modèle d'utilisateur ne demande pas intentionnellement le nom de l'entreprise, et c'est le user_id qui s'affiche actuellement dans l'URL.

Existe-t-il un moyen d'extraire le nom de l'entreprise du modèle de profil (à savoir @ profile.name) et de l'utiliser pour remplir la partie [user_id] de l'URL? MISE À JOUR: J'ai configuré la gemme friendly_id et il me semble que cela pourrait fonctionner. Dans mon modèle de profil, j'ai ceci: has_friendly_id :name, :use_slug => true

Quand je mis à jour un profil, friendly_id a fait slugify l'url en mettant le nom commercial du profil dans la user_id partie de l'URL. Mais, bien sûr, cela a créé une exception. Par conséquent, si le nom de l'entreprise dans le modèle de profil est Mike's Bar, l'URL indique maintenant/users/mike-s-bar/profile. L'exception dit ceci: Impossible de trouver l'utilisateur ID=mike-s-bar.

Voici mon contrôleur de profils:

def show 
    @user = User.find(:all) 
    @profile = User.find(params[:user_id]) 
end 

est-il un moyen de faire ce travail?

Répondre

0

Hmm, est-ce que Business a plusieurs utilisateurs? Si oui, comment /users/xzy/profile peut-il être unique? Sinon, je ne pense pas que friendly_id puisse gérer les colonnes en dehors de la table des modèles. Mais ici une approche que je voudrais essayer:

class User 

    # used by rails to generate URLs - defaults to ID 
    def to_param 
    "#{self.id}-#{self.business.name}" 
    end 

    ... 
end 

La méthode find ignore tout ce qui derrière un tableau de bord par lui-même. Cela rendrait vos URL un peu moins lisibles: /users/xzy/profile deviendra /users/7-xzy/profile ce qui est assez similaire à la façon dont ça fonctionne.

+0

Je seconde, mais ajouterait un appel à paramétrez:

def to_param "#{id}-#{business.name.parameterize}" end
Vous voulez garder le dans l'URL puisque nous sommes sûrs qu'il identifie de façon unique vos utilisateurs. – hgmnz