【问题标题】:Failing attempt to specify param name in nested route尝试在嵌套路由中指定参数名称失败
【发布时间】:2017-04-16 17:06:10
【问题描述】:

考虑这个路线设置:

  resources :potatos do
    get "foo", to: "foo#foo"
  end

这会生成这样的显示路线:

/potatos/:id

但是生成的 foo 路由不同:

/potatos/:potato_id/foo

我希望 foo 路由使用 :id 参数,而不是 :potato_id。这是因为我有现有的(共享的)控制器逻辑,它需要一个 :id 参数

根据Naming params of nested routes 的建议,我尝试了resources(:potatos, param: :id),但结果相同。

【问题讨论】:

  • 不相关,但这不是“potato”的复数形式。
  • 为什么不像get '/potatos/:id/foo', to: 'foo#foo'和resources :potatos这样将get路由从嵌套资源中拉出来
  • @user3366016 这就是我作为解决方法所做的,但我正在钓鱼看看是否还有其他方法
  • @maxpleaner 是有道理的。我认为这应该可以使它保持嵌套并且更清洁。不过,我倾向于将这种类型的东西从嵌套路由中拉出来。 resources :potatos do get "foo", to: "foo#foo", on: :member end
  • @user3366016 得到undefined local variable or method 'on' for #<ActionDispatch::Routing::Mapper。我个人可能也更喜欢避免嵌套路由,但我必须遵循我团队的格言。

标签: ruby-on-rails ruby


【解决方案1】:

因为您只是在寻找实现这一目标的各种方法。我想我会根据 cmets 开始一个答案,以展示我尝试过的各种方法。

所需的格式是:

"/potatos/:id/foo" # :id refers to potato id

资源块之外

如果您的 routes.rb 中不需要嵌套路由,您可以实现这可以通过在资源块之外创建自定义路由来实现。

# routes.rb
# Custom routes    
get '/potatos/:id/foo', to: 'foo#foo'
# Resources
resources :potatos

Rake 路线显示:

GET potatos/:id/foo(.:format) foo#foo

我个人喜欢这种格式,因为它可以让我看到什么是典型资源以及我添加了什么。也就是说,我知道 OP 需要遵循预定义的样式指南,并且 在资源块中需要它(基于评论)。

资源块内部

如果您需要在资源块内完成此操作,到目前为止,我发现将 member route 添加到不同的控制器#action 以便在一个简单的应用程序中为我工作。

  resources :potatos do
    member do
      get "foo", to: "foo#foo"
    end
  end

如果您只有一个成员,则为简化版本。

  resources :potatos do
      get "foo", to: "foo#foo", on: :member
  end

当我 rake 路线时,两者都显示以下内容:

foo_potatos GET /potatos/:id/foo(.:format) foo#foo

但是,OP 在尝试这种格式时收到错误,但在我的测试中它工作正常。

【讨论】:

  • 我没有意识到member 是某种特殊变量。我实际上尝试了on: :id,但没有成功。谢谢,今天试试这个
猜你喜欢
  • 1970-01-01
  • 2011-12-01
  • 1970-01-01
  • 2020-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-30
  • 1970-01-01
相关资源
最近更新 更多