Controller Inheritance如何实现抽象控制器

时间:2014-09-03 20:04:56

标签: ruby-on-rails ruby

鉴于我有一个类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建议让我思考的问题;好吧,我真正的问题是什么,我想要一个anwser? (就像搭便车的徒步旅行者指南)。所以它也是 那么使用哪种代码重用方法呢?

发现了一篇不错的博文here

1 个答案:

答案 0 :(得分:2)

实际上,我认为您的问题可以使用关注模式(控制器或模型之间共享的模块)来解决:How to use concerns in Rails 4