ruby-on-rails – 为嵌套路由包装命名的路由助手

所以我刚刚与一位同事走出了激烈的宗教争论.

我们有对象模型和routes.rb:

resources :orgs do
  resources :lists do
    resources :posts do
      resources :replies
    end
  end
end

所有这些关系都是一对多的,即列表总是属于1个组织,一个帖子总是属于1个列表等.我们非常清楚对多嵌套路由的普遍厌恶,但是有意识地决定走向这个方向.

不幸的是,这意味着当你想链接到编辑回复时,你必须写:

edit_org_list_post_reply_path(reply.post.list.org,reply.post.list,reply.list,reply)

感觉很傻.

我希望能够做到这样的事情:

fast_path(action :: edit,model:reply,type :: path)

并且使用这样一个事实,即回复只属于一个帖子,属于一个列表等,以解决其余问题.就像是:

def fast_path options
  action = options[:action]
  model = options[:model]
  path_or_url = options[:type]

  model_fields = {
    reply: [:org, :list, :post]
    post: [:org, :list],
    list: [:org]
  }[model.class.name]

  arguments = model_fields.map { |field| model.send(field) } + [model]
  named_route_name = model_fields.join("_") + "_" + path_or_url
  named_route_name = action + "_" + named_route_name if action

  send(named_route_name, arguments)
end

虽然我没有验证这是否有效或代码特别好.

然而,我的同事之前已经做过类似的事情,在那里他以更令人愉快的方式覆盖了许多命名路线.他声称它只能导致痛苦,绝望和痛苦,并且正在努力防止这些尝试超出我们的代码.

我很高兴错了,所以请让我们知道你的想法!

最佳答案 如果你不想覆盖路径助手(并且毫无疑问有很好的理由不这样做),你可以改为向Reply模型添加一个方法,如下所示:

def path_args  
  [post.list.org, post.list, post, self]
end

然后只需调用:edit_org_list_post_reply_path(* reply.path_args).

点赞