Rails RESTful Routes:覆盖params [:id]或params [:model_id]默认值

时间:2009-11-21 17:00:32

标签: ruby-on-rails rest routes params defaults

我正在尝试了解如何直接在map.resources上修改此规则:

假设我有路线:

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

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

/:用户/文档

/文档/:ID

/文档/:DOC_ID /规格

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

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

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

基本上它的作用是让你能够在map.resources上添加一个:key参数,这样你就可以定义以后如何引用它,这样我们可以得到类似的东西:

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

所以我总是用params[:doc]来调用param。

但实际上这个补丁有点旧(现在3年) 所以我想知道我们是否没有更新的并且已经内置了rails来执行此任务?

P.S 我不确定模型中定义的to_param方法,显然这对我的请求没有任何改变,而且我仍然得到日志: <{1}}或Parameters: {"doc_id"=>"6"}始终{/ em>

1 个答案:

答案 0 :(得分: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

的网址