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.
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
@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) –
Ich höre dich. Ich füge ein wenig mehr Kontext und Code in die Frage ein. Hoffentlich macht es jetzt mehr Sinn. – Lumbee