如何将params传递给Rails路由中的块?

amr*_*rnt 2 routing ruby-on-rails ruby-on-rails-3

我正在使用Rails 3.我想知道如何将params传递给一些块routes.rb.

我要做的是创建一个catch all路由,从slugs数据库中检查id的模型名称.

得到model name我复数后得到控制器名称.

match '/:id', :controller => proc { Slug.find_by_iid(params[:id]).model.pluralize }, :action => :show
Run Code Online (Sandbox Code Playgroud)

桌子 slugs

model    iid
-----    -----
post     4d2c7de0c5abe7f8a9000007
item     4d2c7de0c5abe7f809000004
Run Code Online (Sandbox Code Playgroud)

当我尝试访问某些页面时,/4d2c7de0c5abe7f8a9000007我收到此错误:

Started GET "/4d2c7de0c5abe7f8a9000007" for
127.0.0.1 at 2011-01-12 00:04:31 +0200

ActionController::RoutingError (wrong constant name #<Proc:0x0000010337c310@):

Rendered /Users/amr/.rvm/gems/ruby-1.9.2-p136@rails3/gems/actionpack-3.0.3/lib/action_dispatch/middleware/templates/rescues/routing_error.erb within rescues/layout (1.2ms)
Run Code Online (Sandbox Code Playgroud)

预期是指向帖子#view with iid:4d2c7de0c5abe7f8a9000007

zet*_*tic 8

proc返回一个Proc,但是match期待一个字符串.您可以尝试添加.call以使proc返回其值.虽然我不确定这是否会最终每次调用proc或仅在routes加载时...

编辑

似乎我与之前的回复和评论相差甚远.也许这样的事情?:

match '/:id', :to => proc { |env|
  id = env["action_dispatch.request.path_parameters"][:id]
  model = Slug.find_by_iid(id).model
  controller = [model.pluralize.camelize,"Controller"].join.constantize
  controller.action("show").call(env)
}
Run Code Online (Sandbox Code Playgroud)

虽然这确实应该在图书馆中定义并包含在内.也许有人知道更好的方法吗?