【问题标题】:Rails weird default routing behaviour in nested namespace in resource资源中嵌套命名空间中的 Rails 奇怪的默认路由行为
【发布时间】:2013-11-22 11:22:08
【问题描述】:

我的 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。

我一直在尝试很多可能性,我不能实现吗?

【问题讨论】:

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


    【解决方案1】:

    路径的构建方式与控制器的确定方式不同。

    控制器可以组织在一个命名空间下。命名空间是控制器可以放置的文件夹。虽然资源和命名空间的顺序会影响路径各部分的顺序,但它不会影响命名空间被视为控制器分组的方式。资源是:groups,因此控制器被命名为“组”并处理针对组模型所做的操作。命名空间是:bills,因此控制器包含在名为“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 文件夹中。

    Rails 从外向内路由 (http://guides.rubyonrails.org/routing.html) 可以提供有关所有路由选项的更多详细信息。

    【讨论】:

    • 感谢您的回复。不过我还是很困惑。我编辑了这个问题,你能帮我解决这个问题吗?谢谢
    • bills#consumption_invoice 操作会做什么?如果您从路径/groups/:id/bills/consumption_invoice 到达此操作,您将有一个可用的组ID,但如果从路径/me/bills/consumption_invoice 到达那里,您将没有组ID。缺少 id 时会出现什么行为?
    • 是的,这正是我知道我来自哪里的方式(我同意有点脏)。但是然后我有@consumer 等于Group.find(params[:id]) 或current_user 并且控制器/视图的行为相同。这样做没有意义吗?干杯
    • 这行得通。只是想确保我们不想使用collection 选项而不是member。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-18
    相关资源
    最近更新 更多