ruby-on-rails données - Comment puis-je appeler les méthodes controller / view à partir de la console dans Rails?




web langage (12)

Quand je charge un script/console , je veux parfois jouer avec la sortie d'un contrôleur ou d'une méthode d'aide à la visualisation.

Y a-t-il des moyens de:

  • simuler une demande?
  • appeler des méthodes d'une instance de contrôleur sur ladite requête?
  • méthodes d'assistance de test, soit via ladite instance de contrôleur ou d'une autre manière?

Answers

À l'intérieur de toute action ou vue du contrôleur, vous pouvez appeler la console en appelant la méthode de la console .

Par exemple, dans un contrôleur:

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

Ou dans une vue:

<% console %>

<h2>New Post</h2>

Cela rendra une console à l'intérieur de votre vue. Vous n'avez pas besoin de vous soucier de l'emplacement de l'appel de la console; il ne sera pas rendu sur le lieu de son invocation mais à côté de votre contenu HTML.

Voir: http://guides.rubyonrails.org/debugging_rails_applications.html


Une autre façon d'y parvenir est d'utiliser le débogueur de rails. Il existe un guide sur le débogage sur http://guides.rubyonrails.org/debugging_rails_applications.html

Fondamentalement, démarrez le serveur avec l'option -u:

./script/server -u

Et puis insérez un point d'arrêt dans votre script où vous souhaitez avoir accès aux contrôleurs / helpers / etc ..

class EventsController < ApplicationController
  def index
    debugger
  end
end

Et lorsque vous faites une demande et que vous cliquez sur cette partie dans le code, la console du serveur renverra une invite vous permettant de faire des demandes, d'afficher des objets, etc. à partir d'une invite de commande. Lorsque vous avez terminé, tapez 'cont' pour continuer l'exécution. Il existe également des options pour le débogage étendu, mais cela devrait au moins vous aider à démarrer.



Voici une façon de le faire via 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 création d'une nouvelle instance d' ActionView::Base vous donne accès aux méthodes d'affichage normales que votre assistant utilise probablement. L'extension de YourHelperModule mélange ses méthodes dans votre objet, ce qui vous permet d'afficher leurs valeurs de retour.


Pour appeler des assistants, utilisez l'objet d' helper :

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

Si vous voulez utiliser un assistant qui n'est pas inclus par défaut (disons, parce que vous avez supprimé helper :all de ApplicationController ), il suffit d'inclure l'assistant.

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

En ce qui concerne les contrôleurs , je cite Nick's réponse Nick's :

> 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

Si vous devez tester depuis la console (testé sur Rails 3.1 et 4.1):

Actions du contrôleur d'appel:

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

Méthodes ApplicationController:

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

Route Assisters:

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

Voir les aides:

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

Rendre:

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'

Méthodes ActiveSupport:

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

Modules Lib:

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

Voici comment faire une requête POST authentifiée, en utilisant Refinery comme exemple:

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

Vous pourriez aussi les trouver utiles si vous obtenez une erreur:

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

Si la méthode est la méthode POST alors

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

[ici les paramètres seront selon votre applicabilité]

d'autre si c'est la méthode GET alors

app.get 'controller/action'

Si vous avez ajouté votre propre assistant et que vous souhaitez que ses méthodes soient disponibles dans la console, procédez comme suit:

  1. dans la console, exécutez include YourHelperName
  2. vos méthodes d'assistance sont maintenant disponibles dans la console, utilisez-les en appelant method_name(args) dans la console.

Exemple: disons que vous avez MyHelper (avec une méthode my_method ) dans 'app / helpers / my_helper.rb`, puis dans la console faites:

  1. include MyHelper
  2. my_helper.my_method

Vous pouvez accéder à vos méthodes dans Rails Console comme suit

controller.method_name
helper.method_name

Un moyen facile d'appeler une action du contrôleur depuis le script / la console et d'afficher / manipuler l'objet de réponse est:

> 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'objet app est une instance de ActionController::Integration::Session

Cela fonctionne pour moi en utilisant Rails 2.1 et 2.3, je n'ai pas essayé les versions antérieures.


Oui,

  • situé près de l'onglet de votre console devrait être un bouton "Open Console" .
  • Si vous cliquez sur ce bouton, l'une de vos options devrait être "Nouvelle vue de la console" .

Vous aurez maintenant 2 vues de la console.

  • L'un de vos autres boutons près de l'onglet de votre console est "Afficher la console sélectionnée" . Lorsque vous choisissez cette option, vous pouvez sélectionner l'une de vos applications en cours d'exécution.
  • Sélectionnez simplement l'onglet, sélectionnez l'application que vous voulez regarder et répétez pour l'autre onglet.

Vous pouvez ensuite déplacer vos 2 vues de console à l'endroit de votre choix, indépendamment l'une de l'autre.

J'utilise Eclipse Helios Release avec l'ID de construction: 20100617-1415.







ruby-on-rails console