• # Comment friendly_id semble fonctionner

    Posté par (site web personnel, Mastodon) . En réponse à l’entrée du suivi Slug purement numérique pour un compte utilisateur et effet sur le routage. Évalué à 3 (+0/-0).

    Faut-il mettre à jour la gem qui gère la production du slug et/OU le routage suivant le slug ? Changer la règle de production du slug (même si on change la production de slug pour ajouter XXX123 quand on ouvre le compte id 123, on aura toujours une collision si on ouvre un compte login XXX123 de toute façon...) ?

    Alors la documentation de friendly_id stipule clairement qu'elle ne gère que la partie base de donnée. Le routage est géré manuellement.

    Avec LinuxFr, par exemple pour le controlleur de user, c'est géré comme ça:

    # encoding: utf-8
    class UsersController < ApplicationController
     before_action :find_user
     def show
     path = user_path(id: @user, format: params[:format])
     redirect_to path, status: 301 and return if request.path != path
     find_nodes([News, Diary])
     respond_to do |wants|
     wants.html
     wants.atom
     end
     end
    [...]
    protected
     def find_user
     @user = User.find(params[:id])
     raise ActiveRecord::RecordNotFound.new unless @user
     @contents = @user.nodes.visible.by_date.limit(20)
     end
    [...]
    end

    Depuis le paramètre id qui vient du path de l'url (/users/:id), on cherche l'utilisateur qui correspond avec User.find (id peut être soit un slug, soit un l'identifiant numérique de l'utilisateur).

    Si le path de l'utilisateur trouvé ne correspond pas au path courant, alors on redirige. Je ne connais pas assez Ruby On Rails pour savoir comment est géré la fonction user_path, mais j’admets qu'elle fonctionne correctement.

    La gem friendly_id modifie la fonction find (parce que l'addon :finders est activé dans friendly_id.rb):

    FriendlyId offers enhanced finders which will search for your record by friendly id, and fall back to the numeric id if necessary.

    C'est pour ça que l'utilisateur avec un slug numérique aura la priorité sur l'utilisateur qui a l'identifiant qui correspond au slug.