从rake任务调用控制器操作

时间:2016-11-01 18:19:02

标签: ruby-on-rails

我在应用程序控制器中有以下内容:

class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception

  def api_auth
    @api_key = Rails.application.secrets.api_key
    @api_secret = Rails.application.secrets.api_secret
    @host_id = Rails.application.secrets.host_id
    @data_type = 'JSON'

    @options = {
      body: {
        api_key: @api_key,
        api_secret: @api_secret,
        host_id: @host_id,
        data_type: @data_type
      }
    }
  end
end

在我的控制器里,我有......

  before_action :api_auth
  ...
  def get_stuff
response = HTTParty.post("api_url", @options)

stuffs = response.parsed_response["stuffs"]
current_stuffs = stuff.all
stuffs.each do |w|
  #unless stuff id already exists in DB, then create it
  #what about if an attribute of a stuff is updated? How do we capture that? UUID?
  unless (current_stuffs.pluck :stuff_id).map(&:to_s).include?(w["id"].to_s)
     stuff.create(stuff_id: w["id"], topic: w["topic"], start_time: w["start_time"], join_url: w["join_url"])
  end
end

..以及以下rake任务......

desc "Heroku task to get stuff"
task :get_stuff => :environment do
  puts "Getting stuff from api..."
  session = ActionDispatch::Integration::Session.new(Rails.application)
  session.post "/posts/get_stuff"
  puts "done."
end

路由正确,运行任务时没有任何错误。但是,当我运行任务时,我的数据库更新操作没有发生。

我知道该动作有效,因为我在视图中设置了一个简单的button_to来调用相同的动作。

2 个答案:

答案 0 :(得分:1)

你是从错误的一端接近它。而不是尝试从应用程序内部访问http端点,只需直接执行该操作的逻辑。

您已进入应用环境并可以访问所有代码!你不需要 http接口。

但是,如果您坚持使用http接口,则可以采用与获取外部api端点相同的方式执行此操作。例如,使用Net::HTTP

答案 1 :(得分:1)

对于后人来说,这就是我想出的:

我摆脱了app控制器中的代码。

在stuff.rb我做了......

solr.facets

在控制器中,只需使用...

调用get get_stuff方法
class Stuff < ApplicationRecord

  def self.get_stuff       
    options = {
  body: {
    api_key: Rails.application.secrets.zoom_api_key,
    api_secret: Rails.application.secrets.zoom_api_secret,
    host_id: Rails.application.secrets.zoom_host_id,
    data_type: 'JSON'
  }
}
  end

  response = HTTParty.post("api_url", @options)

  stuffs = response.parsed_response["stuffs"]
  current_stuffs = stuff.all
  stuffs.each do |w|

    unless (current_stuffs.pluck :stuff_id).map(&:to_s).include?(w["id"].to_s)
     stuff.create(stuff_id: w["id"], topic: w["topic"], start_time: w["start_time"], join_url: w["join_url"])
  end
end

..以及以下rake任务......

def get_stuff
    Stuff.get_stuff
end