复杂的Rails路由

时间:2010-01-09 07:27:43

标签: ruby-on-rails routing rails-routing

我想像github那样使用嵌套的网址,就像How do I route user profile URLs to skip the controller?一样,但不确定如何继续使用它。

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

谢谢你:)

3 个答案:

答案 0 :(得分:1)

怎么样

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

如果您需要RESTful路线,请使用map.resource代替map.connect

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

答案 1 :(得分:1)

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

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

它将创建看起来像http://yoursite.tld/:user/:repo/commit/:id

的标准RESTful路由

同样,如果你永远不会将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)将提供与您的方案匹配的网址。

答案 2 :(得分:0)

您可以根据需要为路线命名,并指定您希望将其用于哪些控制器和操作。

例如,您可能有:

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

这会将请求发送到'transactions'控制器中的'commit'方法。

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

@user = User.find(params[:user])
@repo = Repo.find(params[:repo])