Come invocare il metodo in un controller in un file rubino o un file di script rastrello
-
02-01-2020 - |
Domanda
Se ho un metodo in un controller,
Ad esempio, voglio chiamare il metodo show
in uno script senza aprire le pagine Web.
È possibile farlo?
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
. Soluzione
Questo dovrebbe funzionare nella console dei binari, eseguire rails c
e digitare quanto segue per testare.
app.get('/joseph_memos/1')
output = app.html_document.root.to_s
.
Ma, se vuoi anche trasformarsi in attività di rastrello.Creare le lib / attività / Azioni.Roke nell'app sui binari.E aggiungere le seguenti linee.
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
.
quindi eseguire, rake actions:show[1]
per vedere il risultato.
Ecco il risultato che funziona (cioè, bundle exec rake "actions:show[1]"
su 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>
.
Più esempi: https://github.com/henrik/remit/blob/master/lib/tasks/dev_events.Rake
Spero che questo sia utile per te.
Altri suggerimenti
Penso che sia molto possibile, ma implementarlo non ne vale la pena.Una soluzione alternativa sarebbe quella di creare una classe di servizio che è possibile chiamare nell'azione Mostra e dovresti anche essere in grado di utilizzare la stessa classe al di fuori del controller.
def show
MyShowActionHandler.new(params).do_something
end
class MyShowActionHandler
def initialize(params)
@params = params
end
end
.
Quindi chiamare MyShowActionHandler
in uno script e dovrebbe funzionare finché si carica l'ambiente dei binari.