【发布时间】:2011-11-22 10:45:23
【问题描述】:
如果我在与我正在编写的控制器不同的控制器中有一个方法,并且我想调用该方法,是否有可能,或者我应该考虑将该方法移至帮助器?
【问题讨论】:
-
你能不能通过调用另一个控制器的方法给你想解决的问题添加事实?目前还很模糊,解决方案将取决于问题。
-
确实,请详细说明您要解决的问题。共享方法在做什么?
标签: ruby-on-rails
如果我在与我正在编写的控制器不同的控制器中有一个方法,并且我想调用该方法,是否有可能,或者我应该考虑将该方法移至帮助器?
【问题讨论】:
标签: ruby-on-rails
从技术上讲,您可以创建另一个控制器的实例并在其上调用方法,但这样做很乏味、容易出错并且强烈不推荐。
如果该功能对两个控制器都是通用的,您可能应该在 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
尝试逐步将您的方法移动到您的模型中,如果它们不适用于模型,则使用助手,如果仍需要在 ApplicationController 中的其他地方访问它
【讨论】:
/lib 中。只有视图代码应该存在于帮助器中。
you'll get to the point .... 是什么意思。
lib(或制作一个gem)。
如果您需要做一些数据库操作,那么您可以在该模型中编写一个通用函数(类方法)。模型内部定义的函数可以跨所有控制器访问。但是这个解决方案确实适用于所有情况。
【讨论】:
我不知道您的问题的任何细节,但在您的情况下,路径可能是解决方案(特别是如果它的 RESTful 操作)。
http://guides.rubyonrails.org/routing.html#path-and-url-helpers
【讨论】: