Вызовите функции контроллера приложений из задачи Rake - PullRequest
6 голосов
/ 06 февраля 2010

Я хочу вызвать функцию в моем ApplicationController из задачи rake. Я добавил тег =>: 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 голосов
/ 10 июня 2010

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

Пример:

objEmail = EmailController.new

objEmail.message
6 голосов
/ 06 февраля 2010

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

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

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

0 голосов
/ 02 августа 2014

В вашем задании по рейку у вас есть:

unless ApplicationController.is_admin?

Вы должны добавить .new к имени контроллера:

unless ApplicationController.new.is_admin?
0 голосов
/ 22 декабря 2010

Возможно, причина раджата не имеет смысла, но вопрос верен.

Мне нужно выполнить техническое обслуживание и выполнить функцию внутри класса. Это обходной путь, чтобы исправить вещи один раз (например, миграция), и не обязательно делать это надлежащим образом.

Это можно сделать, вызвав URL вместо вызова рейка (с подходящей настройкой маршрута и параметров).

Это можно сделать, определив функции вне класса (сделав их общедоступными).

Или это можно сделать так, как предложил Уильям Ричерд, что, кстати, работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...