Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何将参数传递到Rails路由中的块?_Ruby On Rails_Routing_Ruby On Rails 3 - Fatal编程技术网

Ruby on rails 如何将参数传递到Rails路由中的块?

Ruby on rails 如何将参数传递到Rails路由中的块?,ruby-on-rails,routing,ruby-on-rails-3,Ruby On Rails,Routing,Ruby On Rails 3,我使用的是Rails3。我想知道如何将参数传递给routes.rb中的某些块 我想做的是做一个catch all路线,从slugs数据库中通过id检查它的型号名称 在获得型号名称后我将其复数化以获得控制器名称 match '/:id', :controller => proc { Slug.find_by_iid(params[:id]).model.pluralize }, :action => :show 表格slug model iid ----- ----- p

我使用的是Rails3。我想知道如何将参数传递给
routes.rb
中的某些块

我想做的是做一个
catch all
路线,从
slugs
数据库中通过id检查它的型号名称

在获得
型号名称后
我将其复数化以获得控制器名称

match '/:id', :controller => proc { Slug.find_by_iid(params[:id]).model.pluralize }, :action => :show
表格
slug

model    iid
-----    -----
post     4d2c7de0c5abe7f8a9000007
item     4d2c7de0c5abe7f809000004
当我尝试访问一些页面,如
/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)
start GET”/4d2c7de0c5abe7f8a9000007“用于
127.0.0.1 2011-01-12 00:04:31+0200

ActionController::RoutingError(错误的常量名#
proc
返回一个proc,但
match
需要一个字符串。您可以尝试添加
。调用
以使该proc返回其值。尽管我不确定这是否会在每次调用该proc时结束,还是仅在加载
routes
时结束调用该proc

编辑

看来我之前的回答和评论太离谱了。也许是这样的吧

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)
}

虽然这真的应该在库中定义并包含在内。也许有人知道更好的方法?

将它放在路由中似乎非常困难。我建议创建一个Slugs控制器,将此任务传递给该控制器,然后从那里重定向到相应的控制器。假设您的其他页面使用标准RESTful路由,y你可以这样做:

将路线更改为:

match '/:id', :controller => :slugs, :action => :show
Slugs控制器:

def show
  slug = Slug.find_by_iid(params[:id])

  redirect_to send("#{slug.model}_url", params[:id])
end

我可以像这样删除
proc
:controller=>Slug.find_by_iid(params[:id]).model.pluralize
但问题仍然是如何获取
params[:id]
值。当我尝试运行应用程序时,它会抛出一个错误
。/config/routes.rb:6:in
block-in::未定义的局部变量或方法
params',for#(错误)
controller=>proc{Slug.find_by_iid(params[:id]).model.pluralize}.call
调用时,它将我抛出了
/config/routes.rb:6:in
块(2层):未定义的局部变量或方法
params'(NameError)
还有!啊,我错过了那里的
参数。我认为这不起作用--
参数设置在控制器中,而不是路由引擎。看看这里的答案:谢谢。我以前已经读过了,不是我要找的解决方案!这个解决方案的发展。我不想重定向,伙计!我只想让应用程序了解我的slug,并加载相关模型。如facebook.com和qoura.com