【问题标题】:Complex Rails Routing复杂的 Rails 路由
【发布时间】:2011-01-03 05:06:33
【问题描述】:

我想做一些类似于 github 的嵌套 url 和 How do I route user profile URLs to skip the controller? 之类的事情,但我不确定如何继续。

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

谢谢你:)

【问题讨论】:

  • 您遇到的具体问题是什么?你试过什么,什么没用?如果您想要与 github 使用的路由相同,那么只需使用相同的路由。
  • 我希望能够在其中嵌套资源,并发现我可以使用 map.with_options :path_prefix => '/:user' do ....

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


【解决方案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 =&gt; current_user, :repo =&gt; @repo) 将提供一个与您的方案匹配的网址。

【讨论】:

    【解决方案2】:

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

    例如,您可能有:

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

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

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

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

    【讨论】:

      【解决方案3】:

      怎么样

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

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

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

      【讨论】:

        猜你喜欢
        • 2021-07-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-07
        • 2013-11-20
        • 2021-11-10
        • 2010-12-05
        相关资源
        最近更新 更多