【问题标题】:Call controller from rake task从 rake 任务调用控制器
【发布时间】:2014-04-08 11:54:35
【问题描述】:

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

编辑: 还有其他提示吗?我试过这个但不起作用:

controller_obj = Controller.new
controller.your_method

我遇到了这个异常:

rake aborted!
uninitialized constant Controller

编辑2: 我试过了:

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

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

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

【问题讨论】:

  • 你想做什么?控制器应该处理请求,你的任务不是真正的请求,看起来你需要别的东西,但不清楚,因为你没有说你真正想要做什么
  • 临时我需要从 rake 任务中调用这个控制器。所以我需要模拟http请求。以及如何模拟 POST 请求?或使用参数获取
  • 这就是你想要做的“如何”,但你想要什么?为什么需要模拟帖子或获取请求?也许你需要别的东西,在任务中调用控制器动作是不正常的
  • 很简单。我必须添加产品数据,我想向控制器发送一些参数,然后在数据库中创建实体。在不久的将来,我将使用某种形式创建视图,并使用此控制器。但现在我想将一些数据从 rake 任务发送到控制器并将实体添加到数据库。无论如何,我都会将这些数据保存在我的控制器中。
  • 你不能这样做,你必须将逻辑移动到模型中,也许任务中的一些逻辑和你的控制器和你的任务会有类似(但不同)的代码,你正在尝试将控制器用于不适合的事物

标签: ruby-on-rails ruby http


【解决方案1】:
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

【讨论】:

【解决方案2】:

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

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

model_obj = Model.new
model_obj.your_instance_method

并且仍然想要调用控制器动作,那么你应该在你的 rake 任务中创建控制器的一个实例并使用该实例调用该动作(如果该方法是一个实例方法。)

controller_obj = Controller.new
controller.your_method

【讨论】:

  • 这是临时解决方案。在不久的将来,我将为这种情况创建视图,但现在我想准备控制器。 controller_obj = Controller.new
【解决方案3】:

感谢@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

请注意,我正在记忆会话对象,因为实例化很慢,而且我多次调用此方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-13
    • 2013-09-01
    • 2011-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-27
    相关资源
    最近更新 更多