Come si chiamano i metodi controller / view dalla console in Rails?

Quando carico script/console , alcune volte voglio giocare con l’output di un controller o un metodo helper view.

Ci sono modi per:

  • simulare una richiesta?
  • chiamare i metodi da un’istanza del controllore su detta richiesta?
  • testare metodi di supporto, sia tramite detta istanza del controllore o in un altro modo?

Per chiamare gli helper, usa l’object helper :

 $ ./script/console >> helper.number_to_currency('123.45') => "R$ 123,45" 

Se vuoi usare un helper che non è incluso di default (ad esempio, perché hai rimosso helper :all da ApplicationController ), includi semplicemente l’helper.

 >> include BogusHelper >> helper.bogus => "bogus output" 

Per quanto riguarda i controller , cito la 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 

Un modo semplice per chiamare un’azione del controller da script / console e visualizzare / manipolare l’object risposta è:

 > 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’object 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):

Chiamare le azioni del controller:

 app.get '/' app.response app.response.headers # => { "Content-Type"=>"text/html", ... } app.response.body # => "\n\n\n\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 gli helper:

 foo = ActionView::Base.new foo.javascript_include_tag 'myscript' #=> "" helper.link_to "foo", "bar" #=> "foo" ActionController::Base.helpers.image_tag('logo.png') #=> "\"Logo\"" 

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 di 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 => #, @controller=nil, @view_paths=[]> >> foo.extend YourHelperModule => #, @controller=nil, @view_paths=[]> >> foo.your_helper_method(args) => "created by your helper" 

La creazione di una nuova istanza di ActionView::Base consente di accedere ai normali metodi di visualizzazione che il tuo helper probabilmente utilizza. Quindi estendere YourHelperModule mescola i suoi metodi nel tuo object permettendoti di vedere i loro valori di ritorno.

Un altro modo per farlo è usare il debugger delle rotaie. C’è una guida per i rails sul debugging su http://guides.rubyonrails.org/debugging_rails_applications.html

Fondamentalmente, avviare il server con l’opzione -u:

 ./script/server -u 

Quindi inserisci un punto di interruzione nel tuo script in cui desideri avere accesso ai controller / helper / ecc.

 class EventsController < ApplicationController def index debugger end end 

E quando si effettua una richiesta e si colpisce quella parte nel codice, la console del server restituirà un prompt in cui è ansible quindi effettuare richieste, visualizzare oggetti, ecc. Da un prompt dei comandi. Al termine, digita "cont" per continuare l'esecuzione. Ci sono anche opzioni per il debug esteso, ma questo dovrebbe almeno iniziare.

Se il metodo è il metodo POST , allora

 app.post 'controller/action?parameter1=value1&parameter2=value2' 

[qui i parametri saranno conformi alla tua applicabilità]

altrimenti se è il metodo GET allora

 app.get 'controller/action' 

Puoi accedere ai tuoi metodi in Rails Console come segue

 controller.method_name helper.method_name 

Ecco come fare una richiesta POST autenticata, usando la raffineria come esempio:

 # 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 trovarli utili anche se ricevi un errore:

 app.cookies.to_hash app.flash.to_hash app.response # long, raw, HTML 

In rails 3, prova questo:

 session = ActionDispatch::Integration::Session.new(Rails.application) session.get(url) body = session.response.body 

Il corpo conterrà l’HTML dell’URL.

Come eseguire il routing e il rendering (invio) da un modello in Rails 3

Le risposte precedenti stanno chiamando gli helper ma quanto segue aiuterà a chiamare i metodi del controller. Ho usato questo su rotaie 2.3.2.

per prima cosa 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 rails puoi digitare qualcosa come …

 request(:controller => :show, :action => :show_frontpage) 

… e l’html verrà scaricato nella console.

Uno dei possibili approcci per il test del metodo Helper nella console di rails è

Struct.new(:t).extend(YourHelper).your_method(*arg)

e per ricaricare e fare

reload!; Struct.new(:t).extend(YourHelper).your_method(*arg)

All’interno di qualsiasi azione o vista del controller, è ansible richiamare 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 %> 

New Post

Questo renderà una console all'interno della tua vista. Non è necessario preoccuparsi della posizione della chiamata alla console; non sarà reso sul posto della sua invocazione ma accanto al tuo contenuto HTML.

Vedi: http://guides.rubyonrails.org/debugging_rails_applications.html

Se hai aggiunto il tuo helper e vuoi che i metodi siano disponibili in console, procedi nel seguente modo:

  1. in console execute include YourHelperName
  2. i tuoi metodi di supporto sono ora disponibili in console, li usi chiamando method_name(args) nella console.

Esempio: dì che hai MyHelper (con un metodo my_method ) in “app / helpers / my_helper.rb`, quindi nella console fai:

  1. include MyHelper
  2. my_helper.my_method