【问题标题】:Create an action with a class method in Rails在 Rails 中使用类方法创建动作
【发布时间】:2014-10-15 05:19:55
【问题描述】:

我想使用类方法在控制器内创建自定义操作。但有可能吗?

我看起来像:

class HellosController < ActionController::Base
  def self.index
  end
end

那么问题是,我们怎样才能访问它...我试过这个:

get 'hello/'     => 'hellos.index'

但这并不成功。

ArgumentError: Missing :action key on routes definition,请检查您的路由。

我知道这不是来自 Rails 约定,但如果您有一些想法,欢迎您。

【问题讨论】:

  • 我不知道你为什么这样做,但我认为类方法应该在你的模型中,你在控制器中调用它们
  • 有趣。但是如果我想在控制器中使用这个方法(就像所有经典的 MVC 框架一样),我该怎么办?
  • 好吧,self.index 需要被 index 操作调用,以便路由按照 @Jared 的说明工作

标签: ruby-on-rails ruby rack


【解决方案1】:

在控制器中以这种方式使用类方法似乎是个坏主意,或者至少是非常规的,但您可以尝试这样的事情..

class HellosController < ActionController::Base
  def self.index
  end

  def index
    self.class.index
  end
end

当你尝试开始使用实例变量时,不要说我没有警告你:)

【讨论】:

  • 谢谢@Jared。但是是否可以构建从 routes.rb 到此类方法的路由? (不使用实例方法...)
  • ".. 是否可以 .. 从 .. 路由到 [a] 类方法?"我从来没有见过它完成。见AbstractController::Base.action_methods
  • 好吧,我猜,您可以为您的HellosController 覆盖self.action_methodsprocess_actionaction_missing 并在那里处理您的特殊情况。但这似乎是对可能应该在设计级别解决的问题的过于复杂的解决方案(为什么必须使用类方法?)。
  • 因为集合的方法应该是类方法,资源的方法应该是实例方法。因此,索引操作可以是 self.get 并且 show 可以是 get。这样就可以充分利用 OO 堆栈。
  • @Zagzag.. 说“收集方法应该是类方法”是一个有趣的想法,实际上它是模型层的经典想法。但是,这将是对控制器层的根本性改变。我认为 Rails 需要在处理动作之前实例化控制器有技术原因。
猜你喜欢
  • 2016-05-03
  • 1970-01-01
  • 1970-01-01
  • 2013-06-12
  • 1970-01-01
  • 1970-01-01
  • 2019-02-28
  • 2014-08-05
  • 1970-01-01
相关资源
最近更新 更多