我想从rake任务中调用ApplicationController中的函数。我添加了=> :环境标记,但它只是不想工作。
这是我的精简代码 -
lib\taks\autoscrape.rake:
desc "This task will scrape all the movies without info"
task(:autoscrape => :environment) do
require 'application' #probably extraneous
require File.dirname(__FILE__) + '/../../config/environment' #probably extraneous
unless ApplicationController.is_admin?
logger.error = "Sorry, you're not allowed to do that"
return
end
app\controller\application_controller.rb:
class ApplicationController < ActionController::Base
helper :all # include all helpers, all the time
def is_admin?
session[:is_admin] && session[:is_admin] > 0
end
end
result:
rake scrape:autoscrape --trace
** Invoke scrape:autoscrape (first_time)
** Invoke environment (first_time)
** Execute environment
** Execute scrape:autoscrape
rake aborted!
undefined method `is_admin?' for ApplicationController:Class
E:/Dropbox/My Dropbox/Ruby/moviecat/lib/tasks/autoscrape.rake:11
我的其他控制器一直调用此代码,没有问题。我的Rake任务如何调用此代码?这大大简化了,它是一个更大问题的一部分,我想重用更多的代码。
谢谢!
答案 0 :(得分:6)
首先,您得到的错误是因为您正在调用未定义的ApplicationController.is_admin?
,因为您的方法是在ApplicationController
的实例上定义的,而不是在ApplicationController
类的实例上。< / p>
其次,session
(至少对我来说)的概念在佣金任务中并没有太多意义。在命令行中没有除用户会话之外的真实会话,这不是您将获得的。
说实话,我不知道从继承自ApplicationController
或ActionController::Base
的类之外的任何地方调用Controller操作/方法的最佳方法,或者为什么你想要。这些操作/方法专门设计为在请求期间使用,而不是您随时调用的某些操作。如果你确实需要某些东西并且不想重新定义它,请将它放在模型/库中并包含它。
答案 1 :(得分:6)
为控制器创建一个实例并调用控制器内的method.method应为public方法。
示例:
objEmail = EmailController.new
objEmail.message
答案 2 :(得分:0)
也许rajat的原因没有意义,但问题是有效的。
我需要做一些维护,我需要在类中执行一个函数。这是一种解决方法,可以一次性修复(比如迁移),并且不一定要以正确的方式完成。
可以调用url而不是调用rake(使用合适的路由和参数设置)。
可以通过在课堂外定义函数(将其公开)来完成。
或者可以像William Richerd提出的那样完成,顺便说一句,它可以起作用。
答案 3 :(得分:-1)
在您的佣金任务中,您有:
unless ApplicationController.is_admin?
您应该将.new添加到控制器名称:
unless ApplicationController.new.is_admin?