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?
È stato utile?

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&parameter2=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:

  1. nella console eseguire includere YourHelperName
  2. 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:

  1. include MyHelper
  2. my_helper.my_method
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top