2011-08-25 39 views
4

我想要實現的是類似於Github的路由方式。例如。我在URL/hjuskewycz /問題中有一個名爲'question'結果的項目。所以我的目標是讓第一部分是用戶名,第二部分是項目名稱。Rails 3路由:在一個模型中在路徑中使用2個動態段

我嘗試了幾個不同的方法,這是一個我堅持現在:

scope ":username" do 
    resources :projects, :path => "" do 
     resources :pictures 
    end 
end 

使用

project_path :username => project.owner.username, :id => project.to_param 

按預期工作。但是,總是指定用戶名,儘管它始終是用戶的用戶名,但是很繁瑣。我非常喜歡

project_path(:id => project.to_param) 

我知道關於default_url_options和url_for和我挖了代碼。但是,polymorphic_url不使用default_url_options。

我試着在routes.rb中:

resources :projects, :path => "", :defaults => {:username => Proc.new { "just_testing" }} 

,因爲你可以使用約束一個進程,但還沒有得到它的工作無論是。

我project.rb

def to_param 
    "#{owner.username"/#{project.title}" 
end 

試過,我已經花了在這個問題上過多的時間和我目前的方法是使用一個方便的方法來添加:用戶名參數。儘管如此,我認爲在整個地方使用這種方法只是爲了添加一個條目(糟糕的代碼味道)。我想知道這個問題是否有更優雅的解決方案。

回答

0

我想你不應該做的事情在這裏變得複雜,只需要使用這樣的事情:

在routes.rb中

match ':username/:projectname/' => 'projects#show_project' , :as => :show_project 

和project_controller,只是定義這個

def show_project 

    @user =User.find_by_username(params[:username]) 
    @project =Project.find_by_slug(params[:projectname]) 

end 

簡單是更好的,它節省了時間並且易於爲他人所理解

0

你想在你的控制器中這樣做:

before_filter :set_username 

def set_username 
    Rails.application.routes.default_url_options[:username] = @user.name 
end