Вызовите функции Контроллера Приложения от задачи Граблей

Я хочу вызвать функцию в своем 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

Мои другие контроллеры называют этот код все время, никакие проблемы. Как моя задача Граблей может назвать этот код? Это значительно упрощено, это - часть большей проблемы, я хотел бы снова использовать больше кода.

Спасибо!!

6
задан rajat banerjee 6 February 2010 в 18:17
поделиться

2 ответа

Во-первых, вы получаете ошибку, потому что вызываете ApplicationController.is_admin? , который не определен, потому что ваш метод определен в экземплярах ApplicationController , а не в классе ApplicationController .

Во-вторых, концепция сеанса (по крайней мере, для меня) на самом деле не имеет большого смысла в задаче с граблями. Нет никаких реальных сеансов, кроме сеанса вашего пользователя в командной строке, что не то, что вы бы получили.

Честно говоря, я не знаю, как лучше всего вызвать действие / метод контроллера из любого места за пределами классов, которые наследуются от ApplicationController или ActionController :: Base , или зачем вам это нужно. Эти действия / методы специально разработаны для использования во время запроса, а не для какого-либо действия, которое вы вызываете каждый раз. Если вам что-то действительно нужно и вы не хотите переопределять это, поместите это в модель / библиотеку и включите.

6
ответ дан 9 December 2019 в 22:34
поделиться

Создайте экземпляр для контроллера и вызовите метод. Метод внутри контроллера должен быть общедоступным.

Пример:

objEmail = EmailController.new

objEmail.message
6
ответ дан 9 December 2019 в 22:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: