Wie rufe ich Controller / View-Methoden aus der Konsole in Rails?
-
02-07-2019 - |
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?
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¶meter2=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.
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:
- in der Konsole ausführen
include YourHelperName
- 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:
-
include MyHelper
-
my_helper.my_method