我想从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
答案 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/action
到model 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
注意我正在记忆会话对象,因为它实例化的速度很慢,而且我多次调用这个方法。