0

我试图了解如何直接在 map.resources 上更改此规则:

假设我有一条路线:

map.resource :user, :as => ':user', :shallow => true do |user|
    user.resources :docs, :shallow => true do |file|
        file.resources :specs
    end
end

所以我会有这样的 RESTful 路由:

/:用户/文档

/docs/:id

/docs/:doc_id/specs

所以我发现在这种情况下很难跟踪它,params[:doc_id]因为有时是它params[:id],有时是它params[:doc_id],在这种情况下,我想总是调用一个特定的名称,这样我就不必为我的过滤器创建两个不同的声明。

好吧,我做了一些研究,发现了这个补丁:

http://dev.rubyonrails.org/ticket/6814

基本上,它的作用是让您能够在 map.resources 上添加一个 :key 参数,这样您就可以定义稍后引用它的方式,这样我们就可以有类似的东西:

map.resources :docs, :key => :doc ...

所以我总是会params[:doc]改为调用参数。

但实际上这个补丁有点老了(现在已经 3 年了)所以我想知道我们是否没有任何更新的和已经内置的 Rails 来完成这项任务?

PS我不确定模型中定义的 to_param 方法,显然这并没有改变我的请求以及我仍然得到的日志: Parameters: {"doc_id"=>"6"}或者Parameters: {"id"=>"6"}一直。

4

1 回答 1

0

在不编写完全自定义路由的情况下使参数更友好的一种方法是

# docs_controller.rb
def show
  @doc = Doc.find(params[:doc].to_i)
end

# doc.rb
def to_param
  [ id, permalink ].join("-")
  # assumes you're storing a permalink formatted version of the name of your doc
end

# routes.rb
map.resources :docs

这将为您提供类似于 example.com/docs/234-the-name-of-your-doc 的 URL

于 2009-11-21T18:36:10.147 回答