所以我刚刚与一位同事走出了激烈的宗教争论.
我们有对象模型和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).