Я хочу вызвать функцию в своем 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
Мои другие контроллеры называют этот код все время, никакие проблемы. Как моя задача Граблей может назвать этот код? Это значительно упрощено, это - часть большей проблемы, я хотел бы снова использовать больше кода.
Спасибо!!
Во-первых, вы получаете ошибку, потому что вызываете ApplicationController.is_admin?
, который не определен, потому что ваш метод определен в экземплярах ApplicationController
, а не в классе ApplicationController
.
Во-вторых, концепция сеанса
(по крайней мере, для меня) на самом деле не имеет большого смысла в задаче с граблями. Нет никаких реальных сеансов, кроме сеанса вашего пользователя в командной строке, что не то, что вы бы получили.
Честно говоря, я не знаю, как лучше всего вызвать действие / метод контроллера из любого места за пределами классов, которые наследуются от ApplicationController
или ActionController :: Base
, или зачем вам это нужно. Эти действия / методы специально разработаны для использования во время запроса, а не для какого-либо действия, которое вы вызываете каждый раз. Если вам что-то действительно нужно и вы не хотите переопределять это, поместите это в модель / библиотеку и включите.
Создайте экземпляр для контроллера и вызовите метод. Метод внутри контроллера должен быть общедоступным.
Пример:
objEmail = EmailController.new
objEmail.message