Rails在资源中的嵌套命名空间中出现奇怪的默认路由行为

时间:2013-11-22 11:22:09

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

我在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的原因。

我一直在尝试这么多的可能性,我不能实现这个目标吗?

1 个答案:

答案 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路由可以提供有关所有路由选项的其他详细信息。