从Rake任务调用应用程序控制器功能

时间:2010-02-06 18:07:21

标签: ruby-on-rails rake

我想从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任务如何调用此代码?这大大简化了,它是一个更大问题的一部分,我想重用更多的代码。

谢谢!

4 个答案:

答案 0 :(得分:6)

首先,您得到的错误是因为您正在调用未定义的ApplicationController.is_admin?,因为您的方法是在ApplicationController的实例上定义的,而不是在ApplicationController类的实例上。< / p>

其次,session(至少对我来说)的概念在佣金任务中并没有太多意义。在命令行中没有除用户会话之外的真实会话,这不是您将获得的。

说实话,我不知道从继承自ApplicationControllerActionController::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?