我在router.rb中有这个:
namespace :me do
namespace :bills do
get :consumption_invoice, :format => :pdf
end
end
以及
resources :groups do
member do
namespace :bills do
get :consumption_invoice, :format => :pdf
end
end
end
第一个给了我:
me_bills_consumption_invoice GET /me/bills/consumption_invoice(.:format) me/bills#consumption_invoice {:format=>:pdf}
consumption_invoice_bills_group GET /groups/:id/bills/consumption_invoice(.:format) bills/groups#consumption_invoice {:format=>:pdf}
在小组中,被调用的控制器是bills/groups#consumption_invoice
,而不是我期望的groups/bills#consumption_invoice
。
为什么呢?
由于
修改
经过一番反思,这就是我想要实现的目标:
/me/bills/consumption_invoice => :controller => :bills, :action => :consumption_invoice
# and
/groups/:id/bills/consumption_invoice => :controller => :bills, :action => :consumption_invoice
理想情况下,我希望在:me
命名空间和:groups
资源块中同时使用这些规则,以使其更清晰易读。
我希望能够轻松添加更多动作:
/me/bills/subscription_invoice => :controller => :bills, :action => :subscription_invoice
这就是我想在其中创建一个块:bills
的原因。
我一直在尝试这么多的可能性,我不能实现这个目标吗?
答案 0 :(得分:0)
构建路径的方式与确定控制器的方式不同。
可以在命名空间下组织控制器。命名空间是控制器可以驻留的文件夹。虽然资源和命名空间的顺序会影响路径各部分的顺序,但它不会影响命名空间被视为控制器分组的方式。资源为:groups
,因此控制器被命名为“groups”并处理针对组模型的操作。命名空间为:bills
,因此控制器包含在名为“账单”的文件夹中。
以类似的方式,如果你嵌套了两个资源,如:
resources :groups do
resources :users
end
用户操作的路径是/ groups /:id / users,但控制器只会被命名为“users”。
如果您确实希望此操作由组文件夹中的帐单控制器处理,那么您可以使用以下内容自定义行为:
resources :groups do
member do
scope module: 'groups' do
get 'bills/consumption_invoice', :format => :pdf, controller: 'bills'
end
end
end
问题中编辑的其他信息
如果您只希望两条路径达到bills#consumption_invoice
操作,并且您不希望您的bills
控制器存在于名为me
的文件夹中,您可以考虑这样的事情:
get 'me/bills/consumption_invoice', :format => :pdf, to: 'bills#consumption_invoice'
resources :groups do
member do
get 'bills/consumption_invoice', :format => :pdf, controller: 'bills'
end
end
Rails会希望您的consumption_invoice
视图位于bills
文件夹中。
来自Outside In(http://guides.rubyonrails.org/routing.html)的Rails路由可以提供有关所有路由选项的其他详细信息。