Come posso chiamare i metodi controller / view dalla console in Rails?
-
02-07-2019 - |
Domanda
Quando carico script / console
, alcune volte voglio giocare con l'output di un controller o con un metodo helper di visualizzazione.
Ci sono modi per:
- simulare una richiesta?
- chiamare metodi da un'istanza del controller su detta richiesta?
- testare i metodi di supporto, tramite detta istanza del controller o in altro modo?
Soluzione
Per chiamare gli helper, usa l'oggetto helper
:
$ ./script/console
>> helper.number_to_currency('123.45')
=> "R$ 123,45"
Se si desidera utilizzare un helper non incluso per impostazione predefinita (ad esempio, poiché è stato rimosso helper: all
da ApplicationController
), è sufficiente includere l'helper.
>> include BogusHelper
>> helper.bogus
=> "bogus output"
Per quanto riguarda la gestione di controller , cito Risposta di Nick :
> app.get '/posts/1' > response = app.response # you now have a rails response object much like the integration tests > response.body # get you the HTML > response.cookies # hash of the cookies # etc, etc
Altri suggerimenti
Un modo semplice per chiamare un'azione del controller da script / console e visualizzare / manipolare l'oggetto response è:
> app.get '/posts/1'
> response = app.response
# you now have a rails response object much like the integration tests
> response.body # get you the HTML
> response.cookies # hash of the cookies
# etc, etc
L'oggetto app è un'istanza di ActionController :: Integration :: Session
Questo funziona per me usando Rails 2.1 e 2.3, non ho provato le versioni precedenti.
Se è necessario eseguire il test dalla console (testato su Rails 3.1 e 4.1):
Azioni del controller di chiamata:
app.get '/'
app.response
app.response.headers # => { "Content-Type"=>"text/html", ... }
app.response.body # => "<!DOCTYPE html>\n<html>\n\n<head>\n..."
Metodi ApplicationController:
foo = ActionController::Base::ApplicationController.new
foo.public_methods(true||false).sort
foo.some_method
Route Helpers:
app.myresource_path # => "/myresource"
app.myresource_url # => "http://www.example.com/myresource"
Visualizza helper:
foo = ActionView::Base.new
foo.javascript_include_tag 'myscript' #=> "<script src=\"/javascripts/myscript.js\"></script>"
helper.link_to "foo", "bar" #=> "<a href=\"bar\">foo</a>"
ActionController::Base.helpers.image_tag('logo.png') #=> "<img alt=\"Logo\" src=\"/images/logo.png\" />"
Render:
views = Rails::Application::Configuration.new(Rails.root).paths["app/views"]
views_helper = ActionView::Base.new views
views_helper.render 'myview/mytemplate'
views_helper.render file: 'myview/_mypartial', locals: {my_var: "display:block;"}
views_helper.assets_prefix #=> '/assets'
Metodi ActiveSupport:
require 'active_support/all'
1.week.ago
=> 2013-08-31 10:07:26 -0300
a = {'a'=>123}
a.symbolize_keys
=> {:a=>123}
Moduli Lib:
> require 'my_utils'
=> true
> include MyUtils
=> Object
> MyUtils.say "hi"
evaluate: hi
=> true
Ecco un modo per farlo attraverso la console:
>> foo = ActionView::Base.new
=> #<ActionView::Base:0x2aaab0ac2af8 @assigns_added=nil, @assigns={}, @helpers=#<ActionView::Base::ProxyModule:0x2aaab0ac2a58>, @controller=nil, @view_paths=[]>
>> foo.extend YourHelperModule
=> #<ActionView::Base:0x2aaab0ac2af8 @assigns_added=nil, @assigns={}, @helpers=#<ActionView::Base::ProxyModule:0x2aaab0ac2a58>, @controller=nil, @view_paths=[]>
>> foo.your_helper_method(args)
=> "<html>created by your helper</html>"
La creazione di una nuova istanza di ActionView :: Base
ti dà accesso ai normali metodi di visualizzazione che il tuo assistente probabilmente utilizza. Quindi l'estensione YourHelperModule
mescola i suoi metodi nel tuo oggetto permettendoti di visualizzare i loro valori di ritorno.
Un altro modo per farlo è usare il debugger delle rotaie. C'è una guida Rails sul debug a http://guides.rubyonrails.org/debugging_rails_applications.html
Fondamentalmente, avvia il server con l'opzione -u:
./script/server -u
E quindi inserire un punto di interruzione nello script in cui si desidera avere accesso ai controller / helper / ecc.
class EventsController < ApplicationController
def index
debugger
end
end
E quando si effettua una richiesta e si preme quella parte nel codice, la console del server restituirà un prompt in cui è possibile effettuare richieste, visualizzare oggetti, ecc. da un prompt dei comandi. Al termine, basta digitare 'cont' per continuare l'esecuzione. Esistono anche opzioni per il debug esteso, ma questo dovrebbe almeno iniziare.
Se il metodo è POST
, quindi
app.post 'controller/action?parameter1=value1¶meter2=value2'
[qui i parametri saranno secondo la tua applicabilità]
altrimenti se si tratta del metodo GET
app.get 'controller/action'
Ecco come effettuare una richiesta POST autenticata, usando come esempio la raffineria:
# Start Rails console
rails console
# Get the login form
app.get '/community_members/sign_in'
# View the session
app.session.to_hash
# Copy the CSRF token "_csrf_token" and place it in the login request.
# Log in from the console to create a session
app.post '/community_members/login', {"authenticity_token"=>"gT7G17RNFaWUDLC6PJGapwHk/OEyYfI1V8yrlg0lHpM=", "refinery_user[login]"=>'chloe', 'refinery_user[password]'=>'test'}
# View the session to verify CSRF token is the same
app.session.to_hash
# Copy the CSRF token "_csrf_token" and place it in the request. It's best to edit this in Notepad++
app.post '/refinery/blog/posts', {"authenticity_token"=>"gT7G17RNFaWUDLC6PJGapwHk/OEyYfI1V8yrlg0lHpM=", "switch_locale"=>"en", "post"=>{"title"=>"Test", "homepage"=>"0", "featured"=>"0", "magazine"=>"0", "refinery_category_ids"=>["1282"], "body"=>"Tests do a body good.", "custom_teaser"=>"", "draft"=>"0", "tag_list"=>"", "published_at(1i)"=>"2014", "published_at(2i)"=>"5", "published_at(3i)"=>"27", "published_at(4i)"=>"21", "published_at(5i)"=>"20", "custom_url"=>"", "source_url_title"=>"", "source_url"=>"", "user_id"=>"56", "browser_title"=>"", "meta_description"=>""}, "continue_editing"=>"false", "locale"=>:en}
Potresti trovare utili anche questi se ricevi un errore:
app.cookies.to_hash
app.flash.to_hash
app.response # long, raw, HTML
Puoi accedere ai tuoi metodi in Rails Console come segue
controller.method_name
helper.method_name
In Rails 3, prova questo:
session = ActionDispatch::Integration::Session.new(Rails.application)
session.get(url)
body = session.response.body
Body conterrà l'HTML dell'URL.
Come instradare e renderizzare (spedizione) da un modello in Rails 3
Le risposte precedenti chiamano gli helper ma ciò che segue aiuterà a chiamare i metodi del controller. L'ho usato su binari 2.3.2.
prima aggiungi il seguente codice al tuo file .irbrc (che può essere nella tua home directory)
class Object
def request(options = {})
url=app.url_for(options)
app.get(url)
puts app.html_document.root.to_s
end
end
quindi nella console di rotaie puoi digitare qualcosa come ...
request(:controller => :show, :action => :show_frontpage)
... e l'html verrà scaricato sulla console.
All'interno di qualsiasi azione o vista del controller, puoi invocare la console chiamando il metodo console .
Ad esempio, in un controller:
class PostsController < ApplicationController
def new
console
@post = Post.new
end
end
O in una vista:
<% console %>
<h2>New Post</h2>
Questo renderà una console all'interno della tua vista. Non è necessario preoccuparsi della posizione della chiamata della console; non verrà visualizzato al momento della sua invocazione ma accanto al contenuto HTML.
Vedi: http://guides.rubyonrails.org/debugging_rails_applications.html
Un possibile approccio per il test del metodo Helper nella console di rails è
Struct.new (: t) .extend .your_method (YourHelper) (* arg)
e per ricaricare e fare
Ricarica !; Struct.new (: t) .extend .your_method (YourHelper) (* arg)
Per i controller, è possibile creare un'istanza dell'oggetto controller nella console di rails.
Ad esempio,
class CustomPagesController < ApplicationController
def index
@customs = CustomPage.all
end
def get_number
puts "Got the Number"
end
protected
def get_private_number
puts 'Got private Number'
end
end
custom = CustomPagesController.new
2.1.5 :011 > custom = CustomPagesController.new
=> #<CustomPagesController:0xb594f77c @_action_has_layout=true, @_routes=nil, @_headers={"Content-Type"=>"text/html"}, @_status=200, @_request=nil, @_response=nil>
2.1.5 :014 > custom.get_number
Got the Number
=> nil
# For calling private or protected methods,
2.1.5 :048 > custom.send(:get_private_number)
Got private Number
=> nil
Se hai aggiunto il tuo aiuto personale e vuoi che i suoi metodi siano disponibili in console, fai:
- nella console eseguire
includere YourHelperName
- i tuoi metodi helper sono ora disponibili in console, usali chiamando
method_name (args)
in console.
Esempio: supponi di avere MyHelper (con un metodo my_method
) in 'app / helpers / my_helper.rb`, quindi in console fai:
-
include MyHelper
-
my_helper.my_method