So rufen Sie eine Methode in einem Controller in einer Ruby-Datei oder einer Rake-Skriptdatei auf
-
02-01-2020 - |
Frage
Wenn ich eine Methode in einem Controller habe,
Zum Beispiel möchte ich das anrufen show
methode in einem Skript, ohne die Webseiten zu öffnen.
Ist es möglich, es zu tun?
def index
@joseph_memos = JosephMemo.all
@joseph_memo = JosephMemo.new
end
# GET /joseph_memos/1
# GET /joseph_memos/1.json
def show
binding.pry
end
Lösung
Dies sollte in der Rails-Konsole funktionieren, ausführen rails c
und geben Sie Folgendes zum Testen ein.
app.get('/joseph_memos/1')
output = app.html_document.root.to_s
Aber wenn Sie auch zu einer Rechenaufgabe werden wollen.Erstellen Sie die Bibliothek / Aufgaben / Aktionen.harken Sie Ihre Rails-App ein.Und fügen Sie die folgenden Zeilen hinzu.
namespace :actions do
desc "test show action"
task :show, [:id] => :environment do |task, args|
app = ActionDispatch::Integration::Session.new(Rails.application)
app.get("/joseph_memos/#{args[:id]}")
puts app.html_document.root.to_s
end
end
Dann lauf, rake actions:show[1]
um das Ergebnis zu sehen.
Hier ist das Ergebnis, das funktioniert (das heißt, bundle exec rake "actions:show[1]"
auf zsh)
$bundle exec rake "actions:show[1]"
<!DOCTYPE html>
<html>
<head>
<title>Hello</title>
<link data-turbolinks-track="true" href="/assets/joseph_memos.css?body=1" media="all" rel="stylesheet" />
<link data-turbolinks-track="true" href="/assets/scaffolds.css?body=1" media="all" rel="stylesheet" />
<link data-turbolinks-track="true" href="/assets/application.css?body=1" media="all" rel="stylesheet" />
<script data-turbolinks-track="true" src="/assets/jquery.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/jquery_ujs.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/turbolinks.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/joseph_memos.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/application.js?body=1"></script>
<meta content="authenticity_token" name="csrf-param" />
<meta content="lZqYRkVfhZUhMK8EQIRsdoX2l4IpTPPhHKB44DSaq7s=" name="csrf-token" />
</head>
<body>
<p id="notice"></p>
<a href="/joseph_memos/1/edit">Edit</a> |
<a href="/joseph_memos">Back</a>
</body>
</html>
Weitere Beispiele: https://github.com/henrik/remit/blob/master/lib/tasks/dev_events.rake
Hoffe, das ist nützlich für dich.
Andere Tipps
ich denke, es ist sehr gut möglich, aber die Implementierung wird sich nicht lohnen.Eine alternative Lösung wäre, eine Serviceklasse zu erstellen, die Sie in der Show-Aktion aufrufen können, und Sie sollten dieselbe Klasse auch außerhalb des Controllers verwenden können.
def show
MyShowActionHandler.new(params).do_something
end
class MyShowActionHandler
def initialize(params)
@params = params
end
end
Dann ruf einfach an MyShowActionHandler
in einem Skript und es sollte funktionieren, solange Sie die Rails-Umgebung laden.