覆盖Rails为嵌套资源路由助手

时间:2015-06-25 05:11:41

标签: ruby-on-rails ruby

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

GET /posts/:posts_id/comments/:id ...

我想以某种方式覆盖URL帮助程序,以便我可以将它们视为注释不是嵌套资源。

要求

评论只应使用嵌套网址:

/posts/:posts_id/comments/:id

我应该可以这样做:

comments_path @comment

redirect_to @comment

我试过

我可以让Rails生成没有前缀的路由助手:

resources :posts
scope '/posts/:post_id' do
  resources :comments
end

但由于comments_path(@comment)未设置,ActionController::UrlGenerationError仍然会给我post_id

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

根据我的理解,路线助手是ActionDispatch::Routing::UrlFor周围的胶合板。我一直在研究ActionDispatch::RoutingPolymorphicRoutes,但我无法找到生成的帮助器如何将模型实例“序列化”为params。

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

我在想to_param

1 个答案:

答案 0 :(得分:2)

之前我对此有类似的要求,而我所做的只是在我的ApplicationController中创建一个自定义帮助方法,如下所示:

class ApplicationController < ActionController::Base
  ...

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

  helper_method :comment_path
end

这样,您仍然可以在视图,帮助器,控制器等中使用comment_path,但它会使用完整的嵌套路径。

我不知道是否可以使用Rails内部实现,但很简单,我认为这不值得麻烦。