2010-05-04 4 views
5

Je voudrais créer une route de rails pour modifier le profil d'un utilisateur.Rails route dépend de l'utilisateur actuel

au lieu d'avoir à utiliser/utilisateurs /: id/modifier, je voudrais avoir une URL comme/edit_profile

Est-il possible de créer un itinéraire dynamique qui transforme/edit_profile en/users/{user de id}/edit, ou devrais-je faire quelque chose dans un contrôleur ou?

+0

Je pense que c'est un travail de route/contrôleur nommé. –

+0

est-il possible pour vous d'élaborer un peu sur ce que vous entendez par là? Merci! – Lowgain

Répondre

4

vous pouvez créer un contrôleur distinct pour cette tâche, mais vous pourriez al donc continuer à utiliser users_controller et juste vérifier s'il y a un ensemble params[:id]:

def edit 
    if params[:id] 
    @user = User.find(params[:id]) 
    else 
    @user = current_user 
    end 
end 

Mais il faut noter que /users normalement routes à l'action index et non show si vous avez encore la route map.resources :users. Mais vous pouvez configurer un itinéraire singulier différemment appelé pour que:

map.resources :users 
map.resource :profile, :controller => "users" 

De cette façon /users dresserait une liste de tous les utilisateurs, /users/:id montreraient tout utilisateur et /profile témoignerait de la show actuellement connecté à la page des utilisateurs. Pour éditer votre propre profil, vous appelez '/ profile/edit'.

+0

merci! J'ai utilisé une structure d'URL différente, mais j'ai été en mesure d'utiliser votre réponse pour accomplir ce que je voulais! – Lowgain

3

Étant donné qu'une route et un contrôleur ont deux fonctions différentes, vous aurez besoin des deux.

Pour le contrôleur, en supposant que vous stockez l'ID utilisateur dans une session, vous pouvez simplement avoir votre méthode de modifier faire quelque chose comme:

def edit 
    @user = User.find(session[:user_id]) 
end 

ont ensuite un itinéraire qui ressemble à quelque chose comme:

map.edit_profile "edit_profile", :controller => "users", :action => "edit" 

cet itinéraire vous donnera un itinéraire nommé appelé edit_profile_path

0

La réponse de Tomas Markauskas pourrait fonctionner, mais voici la réponse à votre question du Guide Rails:

get 'edit_profile', to: 'users#edit' 

Alors, quand quelqu'un va www.yoursite.com/edit_profile, il acheminera à www.yoursite .com/users/éditer.

Ensuite, dans votre contrôleur, vous pouvez accéder à l'utilisateur

@user = User.find(session[:current_user_id]) 

En supposant que vous définissez cette variable de session lorsque quelqu'un se connecte. En outre, ne pas oublier de vérifier s'ils sont connectés. Ce sera travailler si vous utilisez Resourceful Routing (les Rails par défaut) ou non.

Source: http://guides.rubyonrails.org/routing.html

0

font la route comme

get '/users/:id/edit', to: 'users#edit', as: 'edit_profile' 

Comme expliqué dans cette section de lien 'La dure':

http://augustl.com/blog/2009/styling_rails_urls/

L'URL sera

/users/edit_profile 

Parce que l'ID n'est plus dans l'URL, nous devons changer le code un peu. Lorsqu'un utilisateur est créé, la version du titre correspondant à l'URL est stockée dans la base de données, dans la colonne slug.

Pour une meilleure compréhension de lire le lien ci-dessous

http://blog.teamtreehouse.com/creating-vanity-urls-in-rails

0

écrire dans une maison controleur.

set_roots def

if current_user  
    redirect_to dashboard_home_index_path 
else  
    redirect_to home_index_path 
end  

fin

dans le fichier routes.rb

racine: à => 'maison # set_roots'

Match "/ find_roots" => « maison #set_roots "