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?
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
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.
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
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.
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.
si la méthode est POST
méthode alors
app.post 'controller/action?parameter1=value1¶meter2=value2'
[ici les paramètres seront comme selon votre applicabilité]
sinon si c'est GET
méthode
app.get 'controller/action'
vous pouvez accéder à vos méthodes dans la Console rail comme suit
controller.method_name
helper.method_name
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
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
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.
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)
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
si vous avez ajouté votre propre helper et que vous voulez que ses méthodes soient disponibles en console faites:
- dans la console exécuter
include YourHelperName
- 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:
-
include MyHelper
-
my_helper.my_method