2016-11-01 2 views
0

У меня есть следующий в контроллере приложения:Вызова действия контроллера из задачи грабель

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 

конца

ого следующая задача грабли ...

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 

Пути правильны, и я не получаю никаких ошибок при запуске задачи. Однако, когда я запускаю задачу, мое обновление базы данных не происходит.

Я знаю, что действие работает, потому что у меня есть простая кнопка для настройки, которая вызывает одно и то же действие.

ответ

1

Вы приближаетесь к нему с неправильного конца. Вместо того, чтобы пытаться попасть в конечную точку http из приложения, просто выполните логику из этого действия напрямую.

Вы находитесь в окружении приложений уже и имеете доступ ко всему коду! Вы не необходимо http-интерфейс.

Если вы настаиваете на использовании http-интерфейса, вы можете сделать это так же, как вы получите внешнюю конечную точку api. Например, используя Net::HTTP.

+0

Я думаю, что это мои вопросы Тион; как я могу назвать логику, которая уже существует ... в контроллере. Я понимаю, что логика в коде ... контроллер в этом случае. Я мог бы переместить логику в модель и вызвать ее оттуда с помощью метода класса, но я думаю, что оставить логику в контроллере лучше подходит для того, что я хочу делать. Есть ли другой способ вызова контроллера, который управляется через спокойный маршрут? – Lumbee

+1

@ Lumbee Зависит от того, что это за логика. Вполне вероятно, что лучше переместить эту логику в другом месте (модель или объект обслуживания или что-то в этом роде) –

+0

Я слышу вас. Я добавляю немного больше контекста и кода в вопросе. Надеюсь, теперь это имеет больше смысла. – Lumbee

1

Для потомков, вот что я придумал:

Я избавилась от кода в контроллере приложения.

В stuff.rb я сделал ...

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 

конец

В контроллере, просто вызовите метод получить get_stuff с ...

def get_stuff 
    Stuff.get_stuff 
end 

..И следующая задача грабли ...

desc "Heroku task to get stuff" 
task :get_stuff => :environment do 
    puts "Getting stuff from api..." 
    Stuff.get_stuff 
    puts "done." 
end 
Смежные вопросы