Frage

Wenn ich script/console laden, einige Male habe ich mit dem Ausgang eines Controllers oder einer Ansicht Hilfsmethode spielen möchten.

Gibt es Möglichkeiten, zu:

  • simulieren eine Anfrage?
  • Aufruf Methoden von einer Controller-Instanz auf der Anforderung?
  • Testhilfsmethoden, entweder über die Controller-Instanz oder eine andere Art und Weise?
War es hilfreich?

Lösung

Helfer aufzurufen, verwenden Sie die helper Objekt:

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

Wenn Sie einen Helfer verwenden möchten, die standardmäßig enthalten ist nicht (weil Sie helper :all von ApplicationController entfernt), sind nur die Helfer.

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

Wie für den Umgang mit Controller , ich zitiere Nicks Antwort:

> 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

Andere Tipps

Eine einfache Möglichkeit, eine Controller-Aktion von Skript / Konsole und Ansicht aufrufen / manipulieren das Response-Objekt ist:

> 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

Das App-Objekt ist eine Instanz von Action :: Integration :: Session

Dies funktioniert für mich Rails 2.1 und 2.3 verwenden, ich habe nicht versucht, frühere Versionen.

Wenn Sie von der Konsole (getestet auf Rails 3.1 und 4.1) testen müssen:

Rufsteuerung Aktionen:

app.get '/'              
   app.response            
   app.response.headers  # => { "Content-Type"=>"text/html", ... }
   app.response.body     # => "<!DOCTYPE html>\n<html>\n\n<head>\n..." 

Application Methoden:

foo = ActionController::Base::ApplicationController.new
foo.public_methods(true||false).sort
foo.some_method 

Route Helfer:

app.myresource_path     # => "/myresource" 
app.myresource_url      # => "http://www.example.com/myresource"

View Helfer:

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'

Active Methoden:

require 'active_support/all'
1.week.ago
=> 2013-08-31 10:07:26 -0300
a = {'a'=>123}
a.symbolize_keys
=> {:a=>123}

Lib Module:

> require 'my_utils'
 => true 
> include MyUtils
 => Object 
> MyUtils.say "hi"
evaluate: hi
 => true 

Hier ist ein Weg, dies über die Konsole zu tun:

>> 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>"

eine neue Instanz von ActionView::Base Erstellen können Sie auf die normale Ansicht Methoden zugreifen, die Helfer wahrscheinlich verwendet. Dann erstreckt YourHelperModule mischt seine Methoden in Ihrem Objekt lassen Sie ihre Rückgabewerte anzuzeigen.

Eine andere Möglichkeit, dies zu tun ist, um die Schienen-Debugger zu verwenden. Es gibt eine Rails-Führer über das Debuggen unter http://guides.rubyonrails.org/debugging_rails_applications.html

Im Grunde genommen, starten Sie den Server mit der Option -u:

./script/server -u

Und dann einen Haltepunkt in das Skript einfügen, wo Sie Zugriff auf die Controller / Helfer haben möchten / etc ..

class EventsController < ApplicationController
  def index
    debugger
  end
end

Und wenn Sie einen Antrag stellen und diesen Teil in dem Code getroffen, wird die Server-Konsole eine Eingabeaufforderung zurück, wo Sie dann Anfragen machen können, schauen Sie Objekte, etc .. von einer Eingabeaufforderung. Wenn Sie fertig sind, geben Sie einfach ‚cont‘ Ausführung fortzusetzen. Es gibt auch Optionen für erweiterte Debugging, aber zumindest sollten Sie beginnen.

Wenn Methode ist POST Methode dann

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

[hier Parameter wie pro Ihre Anwendbarkeit wird]

sonst, wenn es GET Methode dann

app.get 'controller/action'

Hier ist, wie eine authentifizierte POST-Anforderung zu machen, mit Raffinerie als Beispiel:

# 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}

Sie können diese nützlich finden, wenn Sie eine Fehlermeldung erhalten:

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

Sie können Ihre Methoden in Rails-Konsole zugreifen wie folgt

controller.method_name
helper.method_name

In Schienen 3, versuchen Sie dies:

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

Body wird der HTML-Code der URL enthalten.

Wie Route und machen (Versand) von einem Modell in Rails 3

Die früheren Antworten fordern Helfer aber die Voraussetzungen für einen Aufruf Controller-Methoden helfen. Ich habe dies auf Schienen verwendet 2.3.2.

zunächst fügen Sie den folgenden Code in Ihrer .irbrc Datei (die in Ihrem Home-Verzeichnis sein kann)

class Object
   def request(options = {})
     url=app.url_for(options)
     app.get(url)
     puts app.html_document.root.to_s    
  end
end

dann in der Schienen-Konsole können Sie eingeben, so etwas wie ...

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

... und die HTML wird auf die Konsole abgeladen werden.

Innerhalb jeder Controller-Aktion oder Ansicht, können Sie die Konsole aufrufen, indem Sie die Konsole aufrufen Methode.

Zum Beispiel in einem Controller:

class PostsController < ApplicationController
  def new
    console
    @post = Post.new
  end
end

oder in einer Ansicht:

<% console %>

<h2>New Post</h2>

Dies wird eine Konsole in Ihrer Ansicht machen. Sie müssen nicht über die Lage der Konsole Anruf kümmern; es wird nicht auf der Stelle ihres Aufrufs aber neben Ihrem HTML-Inhalte wiedergegeben werden.

Siehe auch: http://guides.rubyonrails.org/debugging_rails_applications.html

Eine mögliche aproach für Helper-Methode Testen in Schienen Konsole

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

und für Nachladen und tun

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

Für Controller können Sie Controller-Objekt in Schienen Konsole instanziiert.

Beispiel:

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

Wenn Sie Ihre eigenen Helfer hinzugefügt und Sie wollen es Methoden sind in der Konsole zur Verfügung stehen können:

  1. in der Konsole ausführen include YourHelperName
  2. Ihre Hilfsmethoden sind jetzt in der Konsole, verwenden sie method_name(args) in der Konsole aufrufen.

Beispiel: Angenommen, Sie MyHelper (mit einer Methode my_method) in ‚app / Helfer / my_helper.rb` haben, dann in der Konsole zu tun:

  1. include MyHelper
  2. my_helper.my_method
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top