So rufen Sie eine Methode in einem Controller in einer Ruby-Datei oder einer Rake-Skriptdatei auf

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

  •  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
War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top