2011-08-25 40 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