2014-04-25 4 views
0

Je souhaite ajouter des URL personnalisées à un modèle dans mon application. Idéalement, je voudrais qu'il se rabat sur ID si un utilisateur n'a pas de nom d'utilisateur. Voici la solution actuelle que j'ai construite, mais cela ne fonctionne pas.URL de vanité pour le modèle

User.rb

def to_param 
    username || id 
    end 

Contrôleur utilisateur

@user = if params.key?(:username) 
    User.find_by_name(params[:username]) 
else 
    User.find(params[:id]) 
end 

Routes

match "/:username" => "users#show", via: :get 
+0

Utilisez bijou friendly_id: https://github.com/norman/friendly_id – BroiSatse

+0

'méthodes find_by_x' ont été dépréciée depuis un certain temps , vous devriez utiliser 'where (nom d'utilisateur: params [: nom d'utilisateur]). first' – meagar

+0

Peut-être utile si vous avez expliqué ce qui ne fonctionne pas exactement. –

Répondre

0

Votre itinéraire génère un nom d'utilisateur param peu importe si oui ou non il est en fait un nom d'utilisateur ou un ID vous passez. Par conséquent, dans votre contrôleur, vous ne devriez pas essayer d'utiliser params[:id]. A part cela, je ne vois rien de mal avec votre code.

0

Essayez ceci: -

get ':id', to: 'users#show', constraints: lambda { |request| User.where(:username => request.path_parameters[:id]).exists? } 

Contrôleur utilisateur

@user = User.find_by_username(params[:id]) 
unless @user 
    @user = User.find(params[:id]) 
end 
+0

j'ai mis à jour. –