Comment appeler la méthode d'un contrôleur dans un fichier ruby ou un râteau fichier de script

StackOverflow https://stackoverflow.com//questions/25091649

  •  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
Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top