¿Cómo llamo a los métodos de control / vista desde la consola en Rails?

Cuando cargo script/console , algunas veces quiero jugar con la salida de un controlador o un método de vista ayuda.

¿Hay formas de:

  • simular una solicitud?
  • llamar a los métodos de una instancia de controlador en dicha solicitud?
  • probar métodos de ayuda, ya sea a través de dicha instancia de controlador o de otra manera?

Para llamar a ayudantes, use el objeto helper :

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

Si desea utilizar un ayudante que no está incluido por defecto (por ejemplo, porque eliminó helper :all from ApplicationController ), solo incluya el helper.

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

En cuanto a tratar con los controladores , cito la respuesta de Nick :

 > 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 

Una manera fácil de invocar una acción de controlador desde el script / consola y ver / manipular el objeto de respuesta es:

 > 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 

El objeto de la aplicación es una instancia de ActionController :: Integration :: Session

Esto funciona para mí usando Rails 2.1 y 2.3, no probé versiones anteriores.

Si necesita realizar una prueba desde la consola (probado en Rails 3.1 y 4.1):

Acciones del controlador de llamadas:

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

Métodos de ApplicationController:

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

Ayudantes de ruta:

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

Ver ayudantes:

 foo = ActionView::Base.new foo.javascript_include_tag 'myscript' #=> "" helper.link_to "foo", "bar" #=> "foo" ActionController::Base.helpers.image_tag('logo.png') #=> "\"Logo\"" 

Hacer:

 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étodos de ActiveSupport:

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

Módulos de Lib:

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

Esta es una forma de hacerlo a través de la consola:

 >> foo = ActionView::Base.new => #, @controller=nil, @view_paths=[]> >> foo.extend YourHelperModule => #, @controller=nil, @view_paths=[]> >> foo.your_helper_method(args) => "created by your helper" 

Crear una nueva instancia de ActionView::Base le da acceso a los métodos de vista normal que su ayudante probablemente use. Luego, extendiendo YourHelperModule mezcla sus métodos en su objeto, permitiéndole ver sus valores devueltos.

Otra forma de hacerlo es usar el depurador de Rails. Hay una Guía de Rails sobre la depuración en http://guides.rubyonrails.org/debugging_rails_applications.html

Básicamente, inicie el servidor con la opción -u:

 ./script/server -u 

Y luego inserte un punto de interrupción en su secuencia de comandos donde le gustaría tener acceso a los controladores / ayudantes / etc.

 class EventsController < ApplicationController def index debugger end end 

Y cuando realiza una solicitud y pulsa esa parte en el código, la consola del servidor le devolverá un mensaje donde podrá hacer solicitudes, ver objetos, etc. desde un símbolo del sistema. Cuando termine, simplemente escriba 'cont' para continuar la ejecución. También hay opciones para la depuración extendida, pero al menos esto debería comenzar.

Si el método es el método POST , entonces

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

[aquí los parámetros serán según su aplicabilidad]

de lo contrario, si es el método GET , entonces

 app.get 'controller/action' 

Puede acceder a sus métodos en Rails Console como sigue

 controller.method_name helper.method_name 

Aquí se muestra cómo realizar una solicitud POST autenticada, utilizando Refinery como ejemplo:

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

Puede encontrar estos útiles también si obtiene un error:

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

En los Rails 3, intente esto:

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

El cuerpo contendrá el HTML de la url.

Cómo enrutar y representar (despachar) desde un modelo en Rails 3

Las respuestas anteriores están llamando a los ayudantes, pero lo siguiente ayudará a llamar a los métodos del controlador. Lo he usado en los Rails 2.3.2.

primero agregue el siguiente código a su archivo .irbrc (que puede estar en su directorio de inicio)

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

luego en la consola de Rails puedes escribir algo como …

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

… y el html será descargado a la consola.

Un posible enfoque para las pruebas de método Helper en la consola Rails es

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

y para recargar y hacer

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

Dentro de cualquier acción o vista del controlador, puede invocar la consola llamando al método de la consola .

Por ejemplo, en un controlador:

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

O en una vista:

 < % console %> 

New Post

Esto hará que una consola quede dentro de tu vista. No necesita preocuparse por la ubicación de la llamada de la consola; no se representará en el momento de su invocación, sino junto a su contenido HTML.

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

Si ha agregado su propio helper y desea que sus métodos estén disponibles en la consola, haga lo siguiente:

  1. en la ejecución de la consola include YourHelperName
  2. sus métodos de ayuda ahora están disponibles en la consola, utilícelos llamando a method_name(args) en la consola.

Ejemplo: supongamos que tiene MyHelper (con un método my_method ) en ‘app / helpers / my_helper.rb`, luego en la consola do:

  1. include MyHelper
  2. my_helper.my_method