【问题标题】:Rails resources route with dynamic prefix instead of controller name带有动态前缀而不是控制器名称的 Rails 资源路由
【发布时间】:2014-09-21 19:07:42
【问题描述】:

我有一个 TextsController,每个 Text 可以是不同的(固定的)类型。

假设我有一个“书”类型。我想创建一个资源路由来显示文本,我希望路由看起来像这样:

/book/my-book

另一种类型,例如“手动”,应导致使用以下 URL:

/manual/rtfm

好吧,我 have RTFM 我无法让它按照我认为应该工作的方式工作。

这是我尝试过的:

scope '/:text_type' do
  resources :texts, only: :show
end

rake routes 向我展示了以下路线规范:

text GET /:text_type/texts/:id(.:format) texts#show

我不明白为什么应该存在静态“文本”部分?

所以我尝试包含一个空的path 选项:

scope '/:text_type', path: '' do
  resources :texts, only: :show
end

这并没有改变任何东西,我猜是因为(from source)我对scope 的第一个参数实际上覆盖了给path 的任何值。
唯一让我得到我正在寻找的路线设置是:

scope '/:text_type' do
  resources :texts, only: :show, path: ''
end

这似乎完全违背了scope 的目的,即“[范围] 一组到给定默认选项的路由”。

为什么以前的任何表单实际上都不会为我的resources 调用覆盖path

在我看来像一个错误?

那么我应该提交一个错误报告,还是你会用 f* 手册重击我的头? ^^

【问题讨论】:

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


    【解决方案1】:

    首先是范围界定。具有范围的路由用于命名空间路由,就像您对管理区域所做的那样。所以提到的路线是正确生成的,没有错误(也不需要错误报告)。您可以在 Controller Namespaces and Routing 阅读有关命名空间的更多详细信息。
    您可以按照“Creating Vanity URLs in Rails”自行调整参数 或使用friendly_id gem,如Railscast 建议。
    尽管出于几个原因,我会尽可能长时间地坚持使用 id。

    【讨论】:

    • 嗯,文本类型路径前缀其实对于SEO来说纯粹是语义上的东西,内部文本类型之间没有实现差异。根据文档您提供的链接,范围是将默认属性应用于一组路由的方法。他们在示例中使用它来命名空间,事实上,解决namespace 的效果,它将路由到嵌套在模块内的控制器。我可以在没有scope 的情况下实现我想要的,但我必须在每条路线上重复我的路径选项,重复scope 应该是为了避免......
    • 好的。我以不同的方式问这个问题:你期望像 /book/my-book 或 /manual/rtfm 这样的路径返回什么(我假设它们是 GET 路由)?
    • 嗯,我想显示由“my-book”或“rtfm”slug/id 标识的文本。
    • 该 slug/id(例如“my-book”、“rtfm”)在特定范围内是否唯一?
    • 我更改了关于已更改问题的答案。
    猜你喜欢
    • 1970-01-01
    • 2018-12-18
    • 1970-01-01
    • 2017-06-10
    • 1970-01-01
    • 2019-06-30
    • 2015-07-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多