如何使用相同的RESTFUL名称/路由?

时间:2014-06-20 20:05:17

标签: ruby-on-rails ruby ruby-on-rails-4

我有模特爸爸,妈妈和小孩。我已经在为爸爸使用这个孩子的index动作,并且在孩子控制器中为妈妈做了另一个叫做mom_index的动作,因为一个孩子属于一个妈妈和一个爸爸。

现在爸爸的路线是:

dad_kids GET    /dads/:dad_id/kids(.:format)      kids#index

因为:

resources :dads do
  resources :kids
end

我需要妈妈的路线去:

mom_kids GET    /moms/:mom_id/kids(.:format)      kids#mom_index

但是这样做:

resources :moms do
  resources :kids
end

使用已经被父亲使用的孩子的索引动作。如何使用Kids mom_index操作来实现此目的?

2 个答案:

答案 0 :(得分:3)

您可以使用if语句检查请求是针对dads还是moms等:

#app/controllers/kids_controller.rb
Class KidsController < ApplicationController
   def index
      if params[:mom_id].present?
          # mom logic
      elsif params[:dad_id].present?
          #dad logic
      end
   end
end

另一种方法是设置不同的控制器(但不建议这样做,因为它不是DRY):

#config/routes.rb
resources :moms do
   resources :moms_kids, as: "kids" #-> domain.com/moms/:mom_id/kids
end

答案 1 :(得分:2)

最好让kids控制器知道如何处理被爸爸或妈妈命名空间使用或者制作两个名为dads_kidsmoms_kids的独立资源。

因此,对于第一个选项,您可以保留您拥有的路线,但让孩子控制器操作更智能/超载。

对于第二个选项,你会这样做:

resources :dads do
  resources :dads_kids
end

resources :moms do
  resources :moms_kids
end

然后你将拥有2个控制器dads_kids_controller.rbmoms_kids_controller.rb