4

我想要实现的是类似于 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 参数。尽管如此,我认为到处使用这种方法只是为了添加一个条目很臭(代码味道不好)。我想知道这个问题是否有更优雅的解决方案。

4

2 回答 2

0

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

before_filter :set_username

def set_username
  Rails.application.routes.default_url_options[:username] = @user.name
end
于 2013-05-15T08:55:09.563 回答
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

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

于 2012-02-12T08:10:05.760 回答