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



5 Answers

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.

Question

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?



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'



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



Les réponses précédentes appellent des helpers mais les éléments suivants aideront à appeler les méthodes de contrôleur. Je l'ai utilisé 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

puis dans la console des rails, vous pouvez taper quelque chose comme ...

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

... et le code HTML sera déversé sur la console.




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.




À 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




Related