Comment appeler la méthode d'un contrôleur dans un fichier ruby ou un râteau fichier de script
-
02-01-2020 - |
Question
Si j'ai une méthode dans un contrôleur,
Par exemple, je veux appeler l' show
méthode dans un script sans ouvrir les pages web.
Est-il possible de le faire ?
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
La solution
Cela devrait fonctionner dans les Rails de la console, exécutez rails c
et tapez la commande suivante pour tester.
app.get('/joseph_memos/1')
output = app.html_document.root.to_s
Mais, si vous aussi vous voulez transformer en tâche rake.Créer le répertoire lib/tâches/actions.râteau dans votre application rails.Et ajouter les lignes suivantes.
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
Ensuite, exécutez, rake actions:show[1]
pour voir le résultat.
Ici, c'est le résultat qui fonctionne (c'est bundle exec rake "actions:show[1]"
sur 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>
D'autres exemples: https://github.com/henrik/remit/blob/master/lib/tasks/dev_events.rake
Espérons que cela est utile pour vous.
Autres conseils
je pense que c'est très possible, mais la mise en œuvre, il ne sera pas la peine.Une solution alternative serait de créer une classe de service que vous pouvez appeler à l'action et vous devez également être en mesure d'utiliser la même classe à l'extérieur de l'automate.
def show
MyShowActionHandler.new(params).do_something
end
class MyShowActionHandler
def initialize(params)
@params = params
end
end
Puis il suffit d'appeler MyShowActionHandler
dans un script, et il devrait fonctionner aussi longtemps que vous chargez les rails de l'environnement.