Come invocare il metodo in un controller in un file rubino o un file di script rastrello

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

  •  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
.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top