2

我想做一些类似于 github 的嵌套 url,以及如何路由用户配置文件 URL 以跳过控制器?但不确定如何继续。

例如,查看他们拥有的提交:':user/:repo/commit/:sha',控制器正在提交。我将如何复制这种类型的嵌套资源?

谢谢你 :)

4

3 回答 3

1

怎么样

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

或者,如果您需要 RESTful 路由,请使用map.resource而不是。map.connect

在控制器中,可以从参数中检索 URL 信息,例如params[:user]返回用户名。

于 2010-01-09T08:45:58.893 回答
1

如果 commit 是一个 RESTful 控制器,它使用 :sha 而不是 id 来查找记录。你可以这样做:

map.resource :commits, :path_prefix => ':user/:repo', :as => 'commit'

它将创建看起来像的标准 RESTful 路由http://yoursite.tld/:user/:repo/commit/:id

同样,如果您永远不会将 url 中的 id 部分转换为提交 id,那么您没有理由不能将其用作 :sha 值。

例子:

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

您可能还希望在提交模型中覆盖 to_param 以返回 sha 值。

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

因此,现在link_to commit_url(@commit, :user => current_user, :repo => @repo)将提供一个与您的方案匹配的 url。

于 2010-01-10T04:11:15.157 回答
0

您可以随意命名您的路线,并指定您希望将它们与哪些控制器和操作一起使用。

例如,您可能有:

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

这会将请求发送到“事务”控制器中的“提交”方法。

然后可以使用参数在控制器中访问其他变量:

@user = User.find(params[:user])
@repo = Repo.find(params[:repo])
于 2010-01-09T21:13:35.060 回答