Ruby on rails 覆盖嵌套资源的Rails路由帮助程序

Ruby on rails 覆盖嵌套资源的Rails路由帮助程序,ruby-on-rails,ruby,Ruby On Rails,Ruby,假设我有一个带有评论和帖子的经典博客应用程序。 在此应用程序中,注释始终嵌套在帖子下 GET /posts/:posts_id/comments/:id ... 我想以某种方式覆盖URL帮助程序,这样我就可以像注释不是嵌套资源一样覆盖它们 要求: 注释应仅使用嵌套URL: /posts/:posts_id/comments/:id 我应该能够做到: comments_path @comment 及 我试过了: 我可以让Rails生成不带前缀的路由帮助程序,方法是: resources :p

假设我有一个带有评论和帖子的经典博客应用程序。 在此应用程序中,注释始终嵌套在帖子下

GET /posts/:posts_id/comments/:id ...
我想以某种方式覆盖URL帮助程序,这样我就可以像注释不是嵌套资源一样覆盖它们

要求

注释应仅使用嵌套URL:

/posts/:posts_id/comments/:id
我应该能够做到:

comments_path @comment

我试过了

我可以让Rails生成不带前缀的路由帮助程序,方法是:

resources :posts
scope '/posts/:post_id' do
  resources :comments
end
但是
comments\u路径(@comment)
仍然会给我
ActionController::UrlGenerationError
,因为没有设置
post\u id

当然,我可以手动创建自己的helper方法,但如果可能的话,我希望rails生成helper

据我所知,路由帮助程序是
ActionDispatch::Routing::UrlFor
周围的一层装饰。我一直在研究
ActionDispatch::RoutingPolymorphicRoutes
,但我找不到生成的帮助程序如何将模型实例“序列化”为参数

是否可以创建一个模型方法,该方法在routes助手将注释资源转换为参数时使用


我在想一些类似于
to_param
的东西,我以前也有类似的要求,我所做的只是在我的
应用程序控制器中创建一个自定义帮助器方法,如下所示:

class ApplicationController < ActionController::Base
  ...

  def comment_path(comment)
    post_comment_path(comment.post, comment)
  end

  helper_method :comment_path
end
class ApplicationController
这样,您仍然可以在视图、助手、控制器等中使用
comment\u path
,但它使用完全嵌套的路由


我不知道是否可以用Rails的内部构件来完成,但很简单,我认为不值得这么麻烦。

为什么不试试这样的东西<代码>资源:发布资源:评论
,没有
范围
@jonsow谢谢,但你显然不理解这个问题。这将给我
用户注释\u路径
,我需要提供id和post\u id。我知道还有其他解决方案,例如使用装饰器,但我想知道是否可以在模型级别创建覆盖,以便我可以使用开箱即用的帮助程序。如果你不关心你的post路线,你可以使用资源:posts,:as=>“参考资料:注释结束了吗?但是obv很愚蠢。实际上@osman提供了Pythoneske路由帮助程序,比如
\u注释
编辑注释
。如上所述,使用
scope
确实给出了正确的路由和助手名称。这是一个可行的选择,但如果我想要完整的路由助手套件,我希望避免创建
comments\u path
comments\u url
new\u comment\u path
等。也许我可以创建一个助手,它使用元编程来为我生成代码。拥有其中一些路由是不可能的。当您在帖子下嵌套了注释时,您如何拥有
new\u comment\u path
——您必须在该场景中提供帖子,您没有可从中派生的注释。对你来说,最简单的事情可能就是改变你的URL结构——听起来你不想让它们嵌套,或者你在寻找浅嵌套?请参阅第2.7.2节,我认为您在这里是错误的
new_comment_path=new_post_comment_path(post\u id:post.to_param)
假设您定义了一个名为
post
的变量-我不希望在我的代码中有这种隐含的假设。很抱歉,它是
new_comment_path(post.find(55))
class ApplicationController < ActionController::Base
  ...

  def comment_path(comment)
    post_comment_path(comment.post, comment)
  end

  helper_method :comment_path
end