我想做一些类似于 github 的嵌套 url,以及如何路由用户配置文件 URL 以跳过控制器?但不确定如何继续。
例如,查看他们拥有的提交:':user/:repo/commit/:sha',控制器正在提交。我将如何复制这种类型的嵌套资源?
谢谢你 :)
我想做一些类似于 github 的嵌套 url,以及如何路由用户配置文件 URL 以跳过控制器?但不确定如何继续。
例如,查看他们拥有的提交:':user/:repo/commit/:sha',控制器正在提交。我将如何复制这种类型的嵌套资源?
谢谢你 :)
怎么样
map.connect ':user/:repo/commit/:sha', :action => :index
或者,如果您需要 RESTful 路由,请使用map.resource
而不是。map.connect
在控制器中,可以从参数中检索 URL 信息,例如params[:user]
返回用户名。
如果 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。
您可以随意命名您的路线,并指定您希望将它们与哪些控制器和操作一起使用。
例如,您可能有:
map.connect ':user/:repo/commit/:sha', :controller => 'transactions', :action => 'commit'
这会将请求发送到“事务”控制器中的“提交”方法。
然后可以使用参数在控制器中访问其他变量:
@user = User.find(params[:user])
@repo = Repo.find(params[:repo])