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). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |