2010-01-09 8 views
2

Je voudrais faire quelque chose comme github a avec des URLs imbriqués, et comme How do I route user profile URLs to skip the controller? mais pas vraiment sûr comment continuer avec. Par exemple, en regardant un commit, ils ont: ': user /: repo/commit /: sha', avec le contrôleur en cours de validation. Comment répliquer ce type de ressource imbriquée?Rails complexes Routage

merci :)

+0

Quel est exactement le problème que vous rencontrez? Qu'avez-vous essayé et qu'est-ce qui n'a pas fonctionné? Si vous voulez utiliser le même chemin que celui utilisé par github, utilisez simplement la même route. – Eilon

+0

Je voulais être capable d'avoir des ressources imbriquées à l'intérieur de cela, et j'ai compris que je pouvais le faire avec map.with_options: path_prefix => '/: user' do .... –

Répondre

1

Si commit est un contrôleur qui utilise RESTful: sha au lieu d'un identifiant pour trouver des documents. Vous pouvez le faire à la place:

map.resource :commits, :path_prefix => ':user/:repo', :as => 'commit' 

Il crée les itinéraires standards RESTful qui ressemblent à http://yoursite.tld/:user/:repo/commit/:id

Encore une fois, si vous ne serez jamais traduisez la partie id dans l'URL d'un id commit, puis il y a aucune raison pour laquelle vous ne pouvez pas l'utiliser comme: valeur sha.

exemple:

class CommitController < ApplicationController 
    def show 
    @commit = Commit.find(:first, :conditions => {:sha => params[:id]}) 
    end 
    ... 
end 

Vous pouvez également plus to_param tour dans le modèle engager à retourner la valeur sha.

class Commt < ActiveRecord::Base 
    ... 
    def to_param 
    sha 
    end 
end 

Alors que maintenant link_to commit_url(@commit, :user => current_user, :repo => @repo) fournira un URL correspondant à votre schéma.

1

Que diriez-vous

map.connect ':user/:repo/commit/:sha', :action => :index 

Ou utilisez map.resource au lieu de map.connect si vous avez besoin d'une route RESTful.

Dans le contrôleur, les informations d'URL peuvent être extraites des paramètres, par exemple params[:user] renvoie le nom d'utilisateur.

0

Vous pouvez nommer vos itinéraires comme vous le souhaitez et spécifier les contrôleurs et les actions avec lesquels vous souhaitez les utiliser.

Par exemple, vous pourriez avoir:

map.connect ':user/:repo/commit/:sha', :controller => 'transactions', :action => 'commit' 

Cela enverrait la demande à la méthode 'commit' dans le contrôleur "transactions.

Les autres variables peuvent alors accéder à votre contrôleur à l'aide params:

@user = User.find(params[:user]) 
@repo = Repo.find(params[:repo])