【问题标题】:Calling a method from another controller从另一个控制器调用方法
【发布时间】:2011-11-22 10:45:23
【问题描述】:

如果我在与我正在编写的控制器不同的控制器中有一个方法,并且我想调用该方法,是否有可能,或者我应该考虑将该方法移至帮助器?

【问题讨论】:

  • 你能不能通过调用另一个控制器的方法给你想解决的问题添加事实?目前还很模糊,解决方案将取决于问题。
  • 确实,请详细说明您要解决的问题。共享方法在做什么?

标签: ruby-on-rails


【解决方案1】:

从技术上讲,您可以创建另一个控制器的实例并在其上调用方法,但这样做很乏味、容易出错并且强烈不推荐。

如果该功能对两个控制器都是通用的,您可能应该在 ApplicationController 或您创建的另一个超类控制器中拥有它。

class ApplicationController < ActionController::Base
  def common_to_all_controllers
    # some code
  end
end

class SuperController < ApplicationController
  def common_to_some_controllers
    # some other code
  end
end

class MyController < SuperController
  # has access to common_to_all_controllers and common_to_some_controllers
end

class MyOtherController < ApplicationController
  # has access to common_to_all_controllers only
end

按照jimworm 的建议,另一种方法是使用模块来实现通用功能。

# lib/common_stuff.rb
module CommonStuff
  def common_thing
    # code
  end
end

# app/controllers/my_controller.rb
require 'common_stuff'
class MyController < ApplicationController
  include CommonStuff
  # has access to common_thing
end

【讨论】:

  • include GoodSuggestion 谢谢@jimworm
  • 创建另一个控制器的实例???? Arrrrrrrgggh(确实)。另一个选择,因为这个问题很模糊:将代码移到模型中。
  • 由于没有关于这个问题的任何细节(还)我假设@cjm2671 要求控制器特定功能。当然,如果是业务逻辑,必须在模型中:)
【解决方案2】:

尝试逐步将您的方法移动到您的模型中,如果它们不适用于模型,则使用助手,如果仍需要在 ApplicationController 中的其他地方访问它

【讨论】:

  • 我永远不会将代码从控制器移动到帮助器,而是将模块移动到 /lib 中。只有视图代码应该存在于帮助器中。
  • 将某些东西放入助手中只是短暂的。您将达到不必放入库/将所有内容放入模块中的地步也不太好。
  • 我更喜欢使用模块而不是助手,因为它们是真正的面向对象,我可以随意包含/扩展它们。我可以将具有实际意义的东西组合在一起。助手只是桶。我建议仅将这些用于与视图相关的方法。不确定you'll get to the point .... 是什么意思。
  • true OO 是将方法放入模型中。您可以从控制器或视图访问它们,但显然,如果该功能是通用的,您可以将它们放在模块中,并尽可能通过模型​​访问您可以访问的内容。
  • 还有一些功能不属于模型,而是属于它自己的类或模块。例如。解密算法的实现,发送短信,......属于lib(或制作一个gem)。
【解决方案3】:

如果您需要做一些数据库操作,那么您可以在该模型中编写一个通用函数(类方法)。模型内部定义的函数可以跨所有控制器访问。但是这个解决方案确实适用于所有情况。

【讨论】:

    【解决方案4】:

    我不知道您的问题的任何细节,但在您的情况下,路径可能是解决方案(特别是如果它的 RESTful 操作)。

    http://guides.rubyonrails.org/routing.html#path-and-url-helpers

    【讨论】:

      猜你喜欢
      • 2011-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-18
      • 1970-01-01
      • 2019-10-17
      • 1970-01-01
      • 2016-09-14
      相关资源
      最近更新 更多