it-swarm.com.de

Wie rufe ich Controller/Ansichtsmethoden über die Konsole in Rails auf?

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:

  • eine Anfrage simulieren?
  • aufruf von Methoden aus einer Controller-Instanz für die Anforderung?
  • testhilfemethoden, entweder über die Controller-Instanz oder auf andere Weise?
417
kch

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
462
kch

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.

142
Nick

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 
99

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.

72
Gordon Wilson

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.

15
Dan McNevin

Wenn Methode POST Methode ist, dann

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

[hier werden die Parameter entsprechend Ihrer Anwendbarkeit sein]

sonst, wenn es sich um eine GET-Methode handelt

app.get 'controller/action'
14

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
11
Chloe

Sie können auf Ihre Methoden in Rails Console wie folgt zugreifen

controller.method_name
helper.method_name
10
Jyothu

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.

Routen und Rendern (Versenden) eines Modells in Rails 3

8
Tbabs

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.

7
David Knight

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

3

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)

2
dux

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:

  1. in der Konsole ausführen include YourHelperName
  2. ihre Hilfsmethoden stehen jetzt in der Konsole zur Verfügung. Verwenden Sie sie, indem Sie 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:

  1. include MyHelper
  2. my_helper.my_method
1
display_name

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
0
Dyaniyal Nadar