从rake任务调用控制器

时间:2014-04-08 11:54:36

标签: ruby-on-rails ruby http

我想从rake任务调用控制器动作。我的问题是什么方法最好准备http请求?感谢所有提示。

编辑: 还有人提示吗?我试过这个而不行:

controller_obj = Controller.new
controller.your_method

我遇到了这个例外:

rake aborted!
uninitialized constant Controller

EDIT2: 我试过了:

sess = ActionController::Integration::Session.new
sess.post('/route', 'codes=3')

但我得到了(我需要' action_controller / integration'在rake文件中):

rake aborted!
cannot load such file -- action_controller/integration

3 个答案:

答案 0 :(得分:9)

task :use_controller_method_in_rake => :environment do
  session = ActionDispatch::Integration::Session.new(Rails.application)
  session.get "/foo"
  session.post "/bar", {my_post_params: 'foobar'}
end

答案 1 :(得分:6)

您应该将该操作的行为移动到模型类,然后将该操作与该模型类的实例一起使用。这是标准方法。

移动 controller/actionmodel class推荐)。 在您的rake任务中,执行以下操作....

model_obj = Model.new
model_obj.your_instance_method

仍然想要来调用控制器操作然后你应该在rake任务中创建一个控制器实例并用该实例调用该操作(如果该方法是实例方法。)

controller_obj = Controller.new
controller.your_method

答案 2 :(得分:1)

谢谢@ chris-finne,这非常有帮助。请注意,session.response.body就在哪里 你可以访问结果。这是我在rake任务中使用的方法:

def api_json_get(url, params={})
  @rails_session ||= ActionDispatch::Integration::Session.new(Rails.application)
  @rails_session.get(url, { :format => :json }.merge(params))
  JSON.parse(@rails_session.response.body)
end

注意我正在记忆会话对象,因为它实例化的速度很慢,而且我多次调用这个方法。