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

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

comment:

  • simuler une requête?
  • méthodes d'appel à partir d'une instance du contrôleur sur ladite demande?
  • méthodes d'aide de test, soit via ladite instance du contrôleur, soit d'une autre manière?
404
demandé sur kch 2008-09-30 02:36:21

13 réponses

pour appeler les assistants, utilisez le helper objet:

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

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

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

comme pour traiter avec contrôleurs , je cite Nick's réponse:

> 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
454
répondu kch 2017-05-23 10:31:37

une façon facile d'appeler une action de contrôleur à partir du script / de la console et de voir / 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 les Rails 2.1 et 2.3, Je n'ai pas essayé les versions précédentes.

136
répondu Nick 2015-10-01 20:57:41

si vous devez tester à partir de la console (testé sur les Rails 3.1 et 4.1):

Appel Des Actions De Contrôleur:

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

ApplicationController méthodes:

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

Routes Helpers:

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

Aides De Vue:

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'

méthodes de soutien actif:

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 
94
répondu Fernando Fabreti 2016-04-29 13:31:28

Voici une façon de le faire à travers 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 de ActionView::Base vous donne accès aux méthodes de vue normales que votre assistant utilise probablement. Puis l'extension YourHelperModule mélange ses méthodes dans votre objet vous permettant de voir leurs valeurs de retour.

72
répondu Gordon Wilson 2008-09-30 00:19:53

une autre façon de faire cela est d'utiliser le débogueur rails. Il y a un guide sur le débogage à http://guides.rubyonrails.org/debugging_rails_applications.html

en gros, démarrer le serveur avec l'option-u:

./script/server -u

et ensuite insérez un point de rupture dans votre script où vous souhaitez avoir accès aux controllers/helpers/etc..

class EventsController < ApplicationController
  def index
    debugger
  end
end

et quand vous faites un demande et a frappé la partie dans le code, la console du serveur sera de retour une invite d'où vous pouvez faire des demandes, à la vue des objets, etc.. à partir d'une invite de commande. Une fois terminé, tapez simplement 'cont' pour continuer l'exécution. Il y a aussi des options pour le débogage prolongé, mais cela devrait au moins vous permettre de commencer.

15
répondu Dan McNevin 2013-03-27 03:30:23

si la méthode est POST méthode alors

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

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

sinon si c'est GET méthode

app.get 'controller/action'
14
répondu Swapnil Chincholkar 2016-02-29 16:22:06

vous pouvez accéder à vos méthodes dans la Console rail comme suit

controller.method_name
helper.method_name
10
répondu Jyothu 2013-10-30 11:22:39

Voici comment faire une demande POST authentifiée, en utilisant affinerie 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 trouver ces aussi utiles si vous obtenez une erreur:

app.cookies.to_hash
app.flash.to_hash
app.response # long, raw, HTML
10
répondu Chloe 2014-05-28 21:40:15

dans rails 3, Essayez ceci:

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

corps contiendra le HTML de l'url.

Comment la route et de rendu (expédition) à partir d'un modèle dans Rails 3

8
répondu Tbabs 2017-05-23 12:02:50

les réponses précédentes appellent des helpers, mais ce qui suit aidera pour appeler les méthodes de controller. J'ai utilisé ceci sur les rails 2.3.2.

ajoutez d'abord le code suivant à votre .fichier irbrc (qui peut être dans votre répertoire personnel)

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

alors dans la console rails vous pouvez taper quelque chose comme...

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

...et le html sera envoyé à la console.

7
répondu David Knight 2009-07-25 23:58:25

l'une des approches possibles pour l'essai de la méthode de L'aide dans la console des rails est

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

et pour recharger et faire

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

2
répondu dux 2016-06-15 08:57:31

dans n'importe quelle action ou vue du contrôleur, vous pouvez invoquer la console en appelant la méthode console .

par exemple, dans un contrôleur:

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

ou en vue:

<% console %>

<h2>New Post</h2>

cela affichera 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 à l'endroit de son invocation mais à côté de votre contenu HTML.

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

1
répondu Gayan Weerakutti 2017-12-24 07:18:48

si vous avez ajouté votre propre helper et que vous voulez que ses méthodes soient disponibles en console faites:

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

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

  1. include MyHelper
  2. my_helper.my_method
0
répondu Willmore 2018-01-08 07:15:27