【问题标题】:Rails 4: shallow resource not working with collection in RESTful routesRails 4:浅层资源不适用于 RESTful 路由中的集合
【发布时间】:2015-05-18 21:57:26
【问题描述】:

我有一个这样的嵌套资源:

resource :user, controller: :users do
    # code ...
    resources :profile, controller: :profiles, shallow: true do
        # code ...
        collection do
            get :featured
        end
    end
end

焦点是profilesfeatured动作。

此生成的 URL 是 /user/profile/featured。我不明白这一点,因为我指定了shallow: true,但它仍然嵌套在user/ 下。我希望 URL 改为 /profile/featured

如果我只是做get :featured 而不是将它放入集合中,我会得到/profile/:id/featured,这也不是我想要的。

【问题讨论】:

  • resource :user, controller: :users, shallow: true
  • 我刚试过;没用 - shallow 不是用于子/嵌套资源(即您不在父级中使用它,而是在子级中使用它)。
  • 如果您希望 URL 为 /profile/featured,为什么要将您的个人资料和特色资源嵌套在用户内部?通过嵌套,您是在告诉 Rails 您希望在用户的上下文中获取这些资源。
  • 大多数情况下,它会是/user/profile/...,但对于这个特定的路线,我更喜欢它是/profile/featured。这不是什么大问题(我可以简单地为它制作一个自定义路由),但我想知道为什么这里没有应用浅层路由。
  • 我认为如果我提到我在这里进行实验是有意义的,并且上面的代码不是我的真实代码(我将使用shallow do,或者就像我说的那样,使用自定义路由)。

标签: ruby-on-rails routes


【解决方案1】:

给定资源中有两种类型的路由:集合路由(即集合上的路由)和成员路由(即单个记录上的路由)。当您指定嵌套路由应该是浅的时,它只保留必须嵌套的嵌套路由,而其他所有内容都是非嵌套的。让我们稍微简化一下您的路线,以便我们更好地讨论它:

resources :users do
    resources :profiles, shallow: true
end

如果您查看由此生成的路由,您会注意到嵌套在用户下的唯一与配置文件相关的路由是:

  • GET /users/:user_id/profiles:获取此用户的所有配置文件列表
  • GET /users/:user_id/profiles/new:渲染页面以创建一个新的配置文件为此用户
  • POST /users/:user_id/profiles为此用户创建一个新的个人资料

其他所有内容都不再嵌套在用户之下。请注意所有这些的共同点:对于这个用户。这又回到了我之前所说的:Rails 只嵌套它必须的。用户是这里等式的重要组成部分,没有其他方法可以识别它(无论如何,您无需手动工作)。但是,一旦我们有了记录,我们就有了可以操作的配置文件 ID。我们不再关心用户,因此我们不再需要嵌套路由。

一般来说,Rails 期望,因为您已经暗示配置文件属于用户,所以最有意义的做法是只生成在它们所属的用户范围内对集合进行操作的路由。换句话说,在大多数情况下,您并不关心获取整个配置文件集合,您只关心特定用户的配置文件。

因此,收集路线保持嵌套。另一方面,对于成员路由,我们有一个配置文件 ID 可供使用,因此它们没有嵌套。

在您的情况下,您正在尝试做一些不同于上述常规的事情,因此您需要自己创建这样的路线。不过,希望这可以解释您所看到的行为。

最后一点,以防有人注意到:我在这里使用了复数 resources,而您实际上使用了 resource。这实际上并不重要——resource 意味着当它看到/user 路由时,只有一个用户可以操作,这相当于resources 在看到/users/:user_id 路由时的情况。我使用复数形式是因为我觉得它更容易理解。

【讨论】:

    猜你喜欢
    • 2011-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-19
    • 1970-01-01
    • 2015-11-30
    • 2011-11-19
    • 2015-02-10
    相关资源
    最近更新 更多