【问题标题】:Controller Inheritance how to implement an abstract controller控制器继承如何实现抽象控制器
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 我也熟悉关注点,但对我来说,它们似乎不适合这里,因为我只想共享功能并且只有当它们是 AController 时。
猜你喜欢
  • 2019-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多