从Rake任务调用应用程序控制器函数

6
我希望能从我的rake任务中调用ApplicationController中的一个函数。我已经添加了 => :environment 标签,但它似乎无法工作。
这是我简化后的代码 -
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个回答

6
创建一个控制器实例并调用方法。控制器内的方法应为公共方法。
示例:
objEmail = EmailController.new

objEmail.message

这对于 OP 不起作用,因为在此情境中没有建立任何会话。 - sockmonk

6
首先,你收到的错误是因为你调用了ApplicationController.is_admin?,但该方法并未定义,因为该方法是在ApplicationController实例上定义的,而不是在ApplicationController类上定义的。
其次,在我的理解中,session的概念在rake任务中并没有太多意义。除了命令行用户会话之外,没有真正的会话可供使用。
老实说,我不知道从任何继承自ApplicationControllerActionController::Base的类之外的任何地方调用控制器操作/方法的最佳方法,也不知道为什么你想要这样做。这些操作/方法专门设计用于在请求期间使用,而不是在任何时候调用的操作。如果你真的需要某些东西,而又不想重新定义它,请将其放入模型/库中并进行包含。

0

也许Rajat的原因并不合理,但问题是有效的。

我需要进行一些维护工作,并且需要在类内执行一个函数。这是一个解决方法,可以一次性解决问题(如迁移),而不必按照正确的方式执行。

可以通过调用URL而不是调用rake(设置路由和参数适当)来完成。

可以通过在类外定义函数(使其公开)来完成。

或者可以像William Richerd建议的那样完成,顺便说一句,它是有效的。


-1

在你的Rake任务中,你有:

unless ApplicationController.is_admin?

你应该在控制器名称后面添加 .new:

unless ApplicationController.new.is_admin?

真的吗?创建一个控制器的新实例来使用其中的方法?这似乎不正确。 - rajat banerjee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接