如何在没有路线助手的情况下链接到某个动作?
我有路线
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。
我做错了什么?
答案 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
您遇到的问题是namespaced和nested资源之间的混淆。
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