Wenn ich script/console
lade, möchte ich einige Male mit der Ausgabe eines Controllers oder einer View-Helper-Methode spielen.
Gibt es Möglichkeiten zu:
Um Helfer aufzurufen, verwenden Sie das Objekt helper
:
$ ./script/console
>> helper.number_to_currency('123.45')
=> "R$ 123,45"
Wenn Sie einen Helfer verwenden möchten, der nicht standardmäßig enthalten ist (z. B. weil Sie helper :all
aus ApplicationController
entfernt haben), fügen Sie einfach den Helfer hinzu.
>> include BogusHelper
>> helper.bogus
=> "bogus output"
Zum Umgang mit Controllern zitiere ich Nick's 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
Eine einfache Möglichkeit, eine Controller-Aktion von Skript/Konsole aus aufzurufen und das Antwortobjekt anzuzeigen/zu bearbeiten, 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 ActionController :: Integration :: Session
Dies funktioniert für mich mit Rails 2.1 und 2.3, ich habe frühere Versionen nicht ausprobiert.
Wenn Sie von der Konsole aus testen müssen (getestet auf Rails 3.1 und 4.1):
Controller-Aktionen aufrufen:
app.get '/'
app.response
app.response.headers # => { "Content-Type"=>"text/html", ... }
app.response.body # => "<!DOCTYPE html>\n<html>\n\n<head>\n..."
ApplicationController-Methoden:
foo = ActionController::Base::ApplicationController.new
foo.public_methods(true||false).sort
foo.some_method
Routenhelfer:
app.myresource_path # => "/myresource"
app.myresource_url # => "http://www.example.com/myresource"
Helfer anzeigen:
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\" />"
Machen:
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'
ActiveSupport-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 eine Möglichkeit, dies über die Konsole durchzuführen:
>> 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>"
Durch das Erstellen einer neuen Instanz von ActionView::Base
erhalten Sie Zugriff auf die normalen Ansichtsmethoden, die Ihr Helfer wahrscheinlich verwendet. Wenn Sie dann YourHelperModule
erweitern, werden die Methoden in Ihr Objekt gemischt, sodass Sie deren Rückgabewerte anzeigen können.
Eine andere Möglichkeit besteht darin, den Rails-Debugger zu verwenden. Es gibt einen Rails-Guide zum Debuggen unter http://guides.rubyonrails.org/debugging_Rails_applications.html
Starten Sie den Server grundsätzlich mit der Option -u:
./script/server -u
Fügen Sie dann einen Haltepunkt in Ihr Skript ein, an dem Sie Zugriff auf die Controller/Helfer/etc haben möchten.
class EventsController < ApplicationController
def index
debugger
end
end
Wenn Sie eine Anforderung stellen und diesen Teil im Code treffen, gibt die Serverkonsole eine Eingabeaufforderung zurück, in der Sie dann von einer Eingabeaufforderung aus Anfragen erstellen, Objekte anzeigen können. Wenn Sie fertig sind, geben Sie einfach 'cont' ein, um die Ausführung fortzusetzen. Es gibt auch Optionen für das erweiterte Debugging, aber dies sollte zumindest den Einstieg erleichtern.
Wenn Methode POST
Methode ist, dann
app.post 'controller/action?parameter1=value1¶meter2=value2'
[hier werden die Parameter entsprechend Ihrer Anwendbarkeit sein]
sonst, wenn es sich um eine GET
-Methode handelt
app.get 'controller/action'
So stellen Sie eine authentifizierte POST -Anforderung her, am Beispiel der Raffinerie:
# 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önnten diese auch nützlich finden, wenn Sie eine Fehlermeldung erhalten:
app.cookies.to_hash
app.flash.to_hash
app.response # long, raw, HTML
Sie können auf Ihre Methoden in Rails Console wie folgt zugreifen
controller.method_name
helper.method_name
Versuchen Sie Folgendes in Rails 3:
session = ActionDispatch::Integration::Session.new(Rails.application)
session.get(url)
body = session.response.body
Der Body enthält den HTML-Code der URL.
Bei den früheren Antworten handelt es sich um aufrufende Helfer. Die folgenden Anweisungen helfen beim Aufruf von Controller-Methoden. Ich habe dies für Rails 2.3.2 verwendet.
fügen Sie zunächst den folgenden Code zu Ihrer .irbrc-Datei hinzu (die sich in Ihrem Home-Verzeichnis befinden kann).
class Object
def request(options = {})
url=app.url_for(options)
app.get(url)
puts app.html_document.root.to_s
end
end
dann können Sie in der Rails-Konsole etwas eingeben ...
request(:controller => :show, :action => :show_frontpage)
... und die HTML-Datei wird an die Konsole ausgegeben.
In jeder Controller-Aktion oder -Ansicht können Sie die Konsole aufrufen, indem Sie die Methode console aufrufen.
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>
Dadurch wird eine Konsole in Ihrer Ansicht dargestellt. Sie müssen sich nicht um den Ort des Konsolenaufrufs kümmern. Es wird nicht an der Stelle des Aufrufs gerendert, sondern neben Ihrem HTML-Inhalt.
Siehe: http://guides.rubyonrails.org/debugging_Rails_applications.html
Ein möglicher Ansatz für das Testen von Helper-Methoden in Rails console ist
Struct.new(:t).extend(YourHelper).your_method(*arg)
und für reload und doc
reload!; Struct.new(:t).extend(YourHelper).your_method(*arg)
Wenn Sie einen eigenen Helfer hinzugefügt haben und möchten, dass seine Methoden in der Konsole verfügbar sind, führen Sie folgende Schritte aus:
include YourHelperName
method_name(args)
in der Konsole aufrufen. Beispiel: Angenommen, Sie haben MyHelper (mit einer Methode my_method
) in "app/helpers/my_helper.rb", dann in Console:
include MyHelper
my_helper.my_method
Für Controller können Controllerobjekte in der Rails-Konsole instanziiert werden.
Zum 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