2016-11-01 2 views
0

ich folgende in der Anwendungssteuerung habe:eine Controller-Aktion von einer Rake Aufgabe aufrufen

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 

In meinem Controller Ich habe ...

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 

Ende

..und die folgende Rechenaufgabe ...

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 

Die Routen sind korrekt, und beim Ausführen der Aufgabe werden keine Fehler angezeigt. Wenn ich die Aufgabe jedoch ausführe, findet meine DB-Aktualisierungsaktion nicht statt.

Ich weiß, dass die Aktion funktioniert, weil ich eine einfache button_to haben in der Ansicht einrichten, die die gleiche Aktion aufruft.

Antwort

1

Sie es aus dem falschen Ende nähert. Anstatt zu versuchen, den HTTP-Endpunkt innerhalb der App zu treffen, führen Sie die Logik direkt aus dieser Aktion aus.

Sie sind in der App-Umgebung bereits und haben Zugriff auf den gesamten Code! Sie brauchen nicht die die HTTP-Schnittstelle.

Wenn Sie darauf bestehen, mit http-Schnittstelle, obwohl, können Sie diese auf die gleiche Weise tun Sie einen externen api Endpunkt bekommen würde. Zum Beispiel mit Net::HTTP.

+0

Ich denke, das ist meine Frage tion; Wie rufe ich die Logik auf, die schon da ist ... in der Steuerung. Ich bekomme, dass die Logik im Code ist ... der Controller in diesem Fall. Ich könnte die Logik auf das Modell übertragen und von dort aus über eine Klassenmethode aufrufen, aber ich denke, die Logik im Controller zu lassen passt besser zu dem, was ich tun möchte. Gibt es eine andere Möglichkeit, einen Controller zu rufen, der auf einer ruhigen Route ausgeführt wurde? – Lumbee

+1

@Lumbee Hängt davon ab, welche Art von Logik es ist. Es ist wahrscheinlich, dass es besser ist, diese Logik woanders hin zu verschieben (Modell oder Dienstobjekt oder etwas Ähnliches) –

+0

Ich höre dich. Ich füge ein wenig mehr Kontext und Code in die Frage ein. Hoffentlich macht es jetzt mehr Sinn. – Lumbee

1

Denn hier Nachwelt ist, was ich kam mit:

habe ich den Code in der App Controller befreien.

In stuff.rb Ich habe ...

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 

Ende

In der Steuerung, rufen Sie einfach die bekommen get_stuff Methode mit ...

def get_stuff 
    Stuff.get_stuff 
end 

..und die folgende Rake Aufgabe ...

desc "Heroku task to get stuff" 
task :get_stuff => :environment do 
    puts "Getting stuff from api..." 
    Stuff.get_stuff 
    puts "done." 
end 
Verwandte Themen