【发布时间】:2014-10-28 10:52:20
【问题描述】:
鉴于我有一个类 A,它是一种抽象类,并且封装了后代 B 和 C 所需的逻辑。
class A
end
class B < A
end
class C < A
end
此外,如果有资源丰富的路由,为 B 和 C 提供路由,因此由各自的控制器处理。
为了使事情干涸,我将两个控制器的共享代码移动到一个“抽象”控制器中(永远不会被实例化,也没有指向其动作的路由):
class AController < ApplicationController
def new(additional_opts)
render locals: {base: "stuff"}.merge(additional_opts)
end
end
class BController < AController
def new
super(foo: 1)
end
end
class CController < AController
def new
super(bar: 1)
end
end
控制器动作通常没有参数。但是由于 AController 旨在抽象,这种方法可能是有效的,还是依赖实例变量并简单地调用 super 然后从变量中提取所需的信息更好?
欢迎任何见解。
编辑 1:
谢天谢地,Lateralu42 提出了让我思考的问题;好的,我想要回答的真正问题是什么? (就像在搭便车徒步旅行者指南中一样)。所以也是 那么该使用哪种方法进行代码重用呢?
找到一篇不错的博文here。
【问题讨论】:
-
你的方法是正确的。仅仅因为这是控制器,并不意味着您不能拥有带参数的方法而必须依赖实例变量。
标签: ruby-on-rails ruby