【问题标题】:Rails: nesting same resource in multiple nested restful routes?Rails:在多个嵌套的宁静路线中嵌套相同的资源?
【发布时间】:2013-01-01 15:41:47
【问题描述】:

这很容易,但是在框架/语言之间来回切换让我怀疑自己。尝试在 Rails 中为has_many :through 关系制定路线。

#User
has_many :reservations, :dependent => :destroy
has_many :events, :through => :reservations

#Reservation
belongs_to :user
belongs_to :event

#Event
has_many :reservations, :dependent => :destroy
has_many :attendees, through => :reservations, :source => :user

我想要从用户模型中快速构建/创建新预订到特定事件的路线(反之亦然),但不知道如何创建它们。这看起来很奇怪:

resources :users do
  resources :reservations, only: [:new, :create, :destroy]
end

resources :events do
  resources :reservations, only: [:new, :create, :destroy]
end

无论如何,只是在寻找验证,或者可能是另一种处理方式。理想情况下,在用户可以单击的事件旁边的页面上有一个链接,并且(通过 ajax 或页面重新加载)他们会进行“预订”。

出于同样的原因,我需要路由来查看每个对给定事件有预订的用户。 并且为给定用户保留的每个事件。

【问题讨论】:

    标签: ruby-on-rails routes has-many-through


    【解决方案1】:

    我会用它来干燥路线:

    def reserv
      resources :reservations, only: [:new, :create, :destroy]
    end
    
    resources :users do
      reserv
    end
    
    resources :events do
      reserv
    end
    

    【讨论】:

      【解决方案2】:

      好问题!我想我会选择这组路线:

      resources :events do
        resources :reservations, only: [:new, :create, :destroy]
      end
      
      resources :users do
        get 'reservations', :on => :member
      end
      

      您的预订将与活动密切相关。我认为从建模的角度来看这是有道理的。根据您的描述,听起来登录用户会在活动中单击链接以创建预订。通过将预订与事件相关联,您只需从路线就知道要为哪个事件构建预订,并且因为您有一个经过身份验证的用户,您也可以假设要使用哪个用户(可能来自您的会话)。例如,像 POST 这样的路由到/events/5/reservations 将为当前登录的用户创建事件 5 的预留。

      user 资源上的附加 get 操作允许您提供一个端点来回答问题 What reservations does a particular user have?

      理想情况下,您希望确保只有一组端点用于管理资源。就通过非资源操作获取额外信息而言,这更多是一个偏好问题以及您想要支持哪些用例。

      【讨论】:

      • 另外,如果您将resources :reservations 放在eventsusers 下,这将使您的预订控制器代码非常难以管理,因为您需要不断检查您是否有一个事件 ID 或用户 ID。因此,为了理智,这也将有所帮助。 :)
      猜你喜欢
      • 1970-01-01
      • 2013-11-04
      • 2016-02-23
      • 2023-04-02
      • 1970-01-01
      • 2016-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多