如何链接到没有路由助手的操作

时间:2015-11-18 03:16:12

标签: ruby-on-rails ruby-on-rails-3 rails-routing

如何在没有路线助手的情况下链接到某个动作?

我有路线

get '/batches/:id/creation_wizard/add_funds' => 'batch::creation_wizard#add_funds'

如果我在Rails控制台中

include Rails.application.routes.url_helpers
default_url_options[:host] = "localhost"
url_for(controller: 'batch::creation_wizard', action: 'add_funds', id: 1)

我得到"http://localhost/batches/1/creation_wizard/add_funds"

但如果我有

class Batch::CreationWizardController < ApplicationController
  def my_method
    redirect_to controller: 'batch/creation_wizard', action: 'add_funds', id: 1
  end
end

我得到了

No route matches {:controller=>"batch/batch::creation_wizard", :action=>"add_funds", :id=>1}

如果我尝试

redirect_to controller: 'creation_wizard', action: 'add_funds', id: 1

我得到了

No route matches {:controller=>"batch/creation_wizard", :action=>"add_funds", :id=>1}

如果我尝试

redirect_to action: 'add_funds', id: 1

我得到了

No route matches {:action=>"add_funds", :id=>1, :controller=>"batch/creation_wizard"}

我尝试阅读Rails指南“从外部进行Rails路由”和“Rails入门”,我没有注意到任何有用的内容。

我可以将路由更改为

get '/batches/:id/creation_wizard/add_funds' => 'batch::creation_wizard#add_funds', as: :creation_wizard_add_funds

并且依赖路线助手,但这感觉很糟糕。

我正在使用Rails 3.2.22。

我做错了什么?

2 个答案:

答案 0 :(得分:0)

路线需要更改为

get '/batches/:id/creation_wizard/add_funds' => 'batch/creation_wizard#add_funds'

我不知道的是,如果路由错误,我首先能够查看包含http://localhost:3000/batches/521/creation_wizard/add_funds的网页。

版本4.x mentions

的Rails指南
  

对于命名空间控制器,您可以使用目录表示法。对于   例如:

     

资源:user_permissions,controller:'admin / user_permissions'这个   将路由到Admin :: UserPermissions控制器。

     

仅支持目录表示法。指定控制器   使用Ruby常量表示法(例如,控制器:'Admin :: UserPermissions')   可能导致路由问题并导致警告。

但遗憾的是,似乎没有在3.2版本的Rails指南中的equivalent section中提及。

答案 1 :(得分:0)

这将解决它:

class Batch::CreationWizardController < ApplicationController
  def my_method
    redirect_to controller: 'batch::creation_wizard', action: 'add_funds', id: 1
  end
end

您遇到的问题是namespacednested资源之间的混淆。

Namespacing旨在为您提供模块的功能(IE保持与特定类型资源相关的特定级别的功能):

#config/routes.rb
namespace :batch do 
   resources :creation_wizard do
      get :add_funds, on: :member
   end
end

这将创建以下路线:

{action: "show", controller:"batch::creation_wizard", id: "1"}

命名空间基本上是为您提供一个文件夹供您放入控制器。它最常用于admin功能,允许您使用以下内容:

#config/routes.rb
namespace :admin do
   root "application#index"
end

#app/controllers/admin/application_controller.rb
class Admin::ApplicationController < ActionController::Base
   ...
end

这就是你现在所拥有的。

-

如果您想使用嵌套路由(IE使用“顶级”资源来影响“较低级别”资源),您必须将路由更改为以下内容:

#config/routes.rb
resources :batches do
   resources :creation_wizard do
      get :add_funds, on: :member
   end
end

这将提供以下路线:

{controller: "creation_wizard", action: "add_funds", batch_id: params[:batch_id]}

嵌套资源允许您定义“顶级”级别信息(在本例中为batch_id,然后逐步向下调用到被叫控制器。路由将类似于url.com/batches/:batch_id/creation_wizard/add_funds