2010-01-09 5 views
2

나는 github이 중첩 된 URL과 같은 것을하고 싶습니다. How do I route user profile URLs to skip the controller?과 같은 방법을 사용하고 있지만 어떻게 진행해야하는지 잘 모릅니다.복잡한 레일스 라우팅

예를 들어 커밋을 보면 컨트롤러에 커밋이있는 ': user/: repo/commit/: sha'가 있습니다. 이 유형의 중첩 된 리소스를 어떻게 복제합니까?

감사합니다 :)

+0

당신이 가지고있는 문제는 정확히 무엇입니까? 시도한 것은 무엇이고 효과가없는 것은 무엇입니까? github이 동일한 경로를 사용하려면 동일한 경로를 사용하십시오. – Eilon

+0

그 안에 중첩 된 리소스를 가질 수 있기를 원했고, map.with_options : path_prefix => '/ : user'do ...로 처리 할 수 ​​있다고 생각했습니다. –

답변

1

하면 커밋이 사용하는 편안하고 컨트롤러입니다. 대신이 작업을 수행 할 수 있습니다 :

가 당신이 결코 커밋 ID로 URL의 ID 부분을 번역되지 것입니다 경우는, 다시 http://yoursite.tld/:user/:repo/commit/:id

과 같이 표준 편안하고 경로를 생성합니다

, 그럼 거기에

map.resource :commits, :path_prefix => ':user/:repo', :as => 'commit' 
: sha 값으로 사용할 수 없습니다.

예 :

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

또한 샤 값을 반환 확약 모델에 타고 넘는 to_param 할 수 있습니다.

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

이제 link_to commit_url(@commit, :user => current_user, :repo => @repo)은 귀하의 체계와 일치하는 URL을 제공합니다.

1

어떻게

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

또는 당신이 편안하고 경로를 필요로하는 경우 map.resource 대신 map.connect를 사용

에 대해.

컨트롤러에서 URL 정보는 params에서 검색 할 수 있습니다. 예를 들어 params[:user]은 사용자 이름을 반환합니다.

0

경로 이름은 원하는대로 지정할 수 있으며 사용하려는 컨트롤러와 작업을 지정할 수 있습니다.

예를 들어, 당신은 할 수 있습니다

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

이 '거래'컨트롤러에서 '커밋'방법에 요청을 보낼 것입니다.

다른 변수는 다음 컨트롤러 사용 PARAMS에 액세스 할 수 있습니다 샤 대신 ID의 기록을 찾을 :

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