Rails 3路由:在一个模型的路径中使用2个动态段

时间:2011-08-25 12:35:58

标签: ruby-on-rails-3 routes custom-routes

我想要实现的是类似于Github的路线方式。例如。我在URL / hjuskewycz /问题中有一个名为'question'的项目。所以我的目标是让路线的第一段是用户名,第二段是项目的名称。

我尝试了几种不同的方法,这就是我现在所困扰的方法:

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" }}

因为你可以使用proc来进行约束,但是还没有使用它。

我在project.rb中尝试过

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

我花了太多时间处理这个问题,而我当前的方法使用了一个方便的方法来添加:username参数。尽管如此,我认为在整个地方使用这种方法只是为了添加一个条目臭(坏代码气味)。我想知道这个问题是否有更优雅的解决方案。

2 个答案:

答案 0 :(得分: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

更简单更好,它可以节省时间并且易于理解其他人

答案 1 :(得分:0)

你想在你的控制器中做这样的事情:

before_filter :set_username

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