Call controller from rake task

2019-01-19 22:16发布

I would like to call controller action from rake task. My question is what method is the best to prepare http request? Thanks for all tips.

Edit: Have someone another tip? I tried this and not work:

controller_obj = Controller.new
controller.your_method

I got this exception:

rake aborted!
uninitialized constant Controller

Edit2: I tried:

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

But I got (I have require 'action_controller/integration' in rake file) :

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

3条回答
虎瘦雄心在
2楼-- · 2019-01-19 22:34
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
查看更多
孤傲高冷的网名
3楼-- · 2019-01-19 22:38

You should move that action's behavior to a model class, then use that action with the instance of that model class. This is the standard approach.

move controller/action to a model class (Recommended). In your rake task, do the following....

model_obj = Model.new
model_obj.your_instance_method

And still you want to call controller action then you should create an instance of your controller in your rake task and call that action with that instance(if that method is an instance method.)

controller_obj = Controller.new
controller.your_method
查看更多
来,给爷笑一个
4楼-- · 2019-01-19 22:53

Thanks @chris-finne, that was very helpful. Note that session.response.body is where you can access the results. Here's an method I'm using in a rake task:

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

Notice I'm memoizing the session object since it's quite slow to instantiate and I'm calling this method many times.

查看更多
登录 后发表回答