【问题标题】:Rails RESTful Routes: override params[:id] or params[:model_id] defaultsRails RESTful Routes:覆盖 params[:id] 或 params[:model_id] 默认值
【发布时间】:2009-11-21 17:00:32
【问题描述】:

我正在尝试了解如何直接在 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 来完成这项任务?

P.S 我不确定模型中定义的 to_param 方法,显然这并没有改变我的请求和我仍然得到的日志: Parameters: {"doc_id"=>"6"}Parameters: {"id"=>"6"} 一直都是。

【问题讨论】:

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


    【解决方案1】:

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

    # 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

    【讨论】:

    • 我在发帖后看到我并没有完全回答你的问题。 Rails 没有您正在寻找的内置功能,指向当前资源的 params[:id] 的默认值仍然是要走的路。父记录获取 params[:parent_id] 以保持一致性。对于当前资源之外的全局过滤器,为什么不直接将适当的变量作为参数传递给过滤器呢?
    • 是的,没错,谢谢 Bensie。但是,这件事不会给你改变资源密钥的可能性,它有点毫无意义,不是吗?在这种情况下会有什么弊端?我不明白:\
    猜你喜欢
    • 2018-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-24
    • 1970-01-01
    • 2011-11-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多