【问题标题】:Overriding Rails route helpers for nested resource覆盖嵌套资源的 Rails 路由助手
【发布时间】:2015-06-25 05:11:40
【问题描述】:

假设我有一个带有 cmets 和帖子的经典博客应用程序。 在这个应用程序中,cmets 总是嵌套在一个帖子下。

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

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

要求

cmets 应该只使用嵌套的 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,但我找不到生成的助手如何将模型实例“序列化”为参数。

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

我正在考虑类似于to_param 的东西。

【问题讨论】:

  • 你为什么不试试这样的! resources :posts resources :comments,没有scope
  • @jonsnow 谢谢,但你显然不明白这个问题。这会给我user_comments_path,我需要提供 id 和 post_id。
  • 我知道还有其他解决方案,例如使用装饰器,但我想知道是否可以在模型级别创建覆盖,以便我可以使用开箱即用的助手。
  • 如果你不关心你的帖子路线,你可以做资源 :posts, :as => "" 做资源 :cmets end but obv 它很傻。
  • 实际上@osman 提供了 Pythoneske 路由助手,例如 _commentsedit__comment。像我上面所做的那样使用scope 确实给出了正确的路线和助手名称。

标签: ruby-on-rails ruby


【解决方案1】:

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

class ApplicationController < ActionController::Base
  ...

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

  helper_method :comment_path
end

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

我不知道是否可以使用 Rails 内部来完成,但很简单,我认为这不值得。

【讨论】:

  • 这是一个可行的选择,但如果我想要完整的路由助手套件,我希望避免创建comments_pathcomments_urlnew_comment_path 等。也许我可以创建一个使用元编程为我生成代码的助手。
  • 拥有其中一些路线是不可能的。当您将 cmets 嵌套在帖子下时,您如何拥有 new_comment_path - 您必须在这种情况下提供帖子,您没有评论可以从中获得它。对您来说最简单的事情可能就是更改您的 URL 结构 - 听起来您不希望它们嵌套,或者您正在寻找浅嵌套?请参阅第 2.7.2 节 guides.rubyonrails.org/routing.html#nested-resources
  • 我觉得你错了new_comment_path = new_post_comment_path(post_id: post.to_param)
  • 这是一个很大的假设,即您定义了一个名为 post 的变量 - 我不希望在我的代码中出现这种隐式假设。
  • 对不起,应该是new_comment_path(Post.find(55))
猜你喜欢
  • 2015-06-30
  • 2012-04-02
  • 1970-01-01
  • 1970-01-01
  • 2016-04-05
  • 2011-05-23
  • 1970-01-01
  • 2015-11-23
  • 2013-02-27
相关资源
最近更新 更多