ruby-on-rails - rutas - formularios en ruby on rails
¿Cómo llamo a los métodos de controlador/vista desde la consola en Rails? (13)
Cuando cargo un script/console
, algunas veces quiero jugar con la salida de un controlador o un método de ayuda de visualización.
¿Hay maneras de:
- simular una solicitud?
- ¿Métodos de llamada desde una instancia de controlador en dicha solicitud?
- ¿Pruebe los métodos de ayuda, ya sea a través de dicha instancia del controlador o de otra manera?
Aquí hay una forma de hacer esto a través de la consola:
>> 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 creación de una nueva instancia de ActionView::Base
le brinda acceso a los métodos de visualización normales que probablemente utilice su ayudante. Luego, al extender YourHelperModule
mezclan sus métodos en su objeto, lo que le permite ver sus valores de retorno.
Aquí se muestra cómo realizar una solicitud POST autenticada, usando 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
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 %>
<h2>New Post</h2>
Esto hará que una consola dentro de su vista. No necesita preocuparse por la ubicación de la llamada de la consola; no se procesará en el lugar de su invocación sino junto a su contenido HTML.
Consulte: http://guides.rubyonrails.org/debugging_rails_applications.html
En los rieles 3, prueba esto:
session = ActionDispatch::Integration::Session.new(Rails.application)
session.get(url)
body = session.response.body
Cuerpo contendrá el HTML de la url.
Cómo enrutar y renderizar (despachar) desde un modelo en Rails 3
Las respuestas anteriores son ayudantes de llamada, pero lo siguiente ayudará a llamar a los métodos del controlador. He utilizado esto en los carriles 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 rieles puedes escribir algo como ...
request(:controller => :show, :action => :show_frontpage)
... y el html será volcado a la consola.
Otra forma de hacer esto es usar el depurador de rieles. Hay una guía de Rails sobre 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 script 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 golpea esa parte en el código, la consola del servidor le devolverá un mensaje en el que podrá realizar solicitudes, ver objetos, etc. desde un símbolo del sistema. Cuando haya terminado, simplemente escriba ''cont'' para continuar la ejecución. También hay opciones para la depuración extendida, pero esto debería al menos comenzar.
Para llamar a los 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 de forma predeterminada (por ejemplo, porque eliminó el helper :all
de ApplicationController
), solo incluya el ayudante.
>> include BogusHelper
>> helper.bogus
=> "bogus output"
En cuanto a tratar con los controladores , cito Nick''s respuesta 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
Puede acceder a sus métodos en la consola de Rails como sigue
controller.method_name
helper.method_name
Si el método es el método POST
entonces
app.post ''controller/action?parameter1=value1¶meter2=value2''
[aquí los parámetros serán según su aplicabilidad]
más si es el método GET
entonces
app.get ''controller/action''
Si ha agregado su propio ayudante y desea que sus métodos estén disponibles en la consola, haga lo siguiente:
- en la consola ejecutar
include YourHelperName
- sus métodos de ayuda ahora están disponibles en la consola, utilícelos llamando a
method_name(args)
en la consola.
Ejemplo: digamos que tienes MyHelper (con un método my_method
) en ''app / helpers / my_helper.rb`, luego en la consola haz:
-
include MyHelper
-
my_helper.my_method
Si necesita probar 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<html>/n/n<head>/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'' #=> "<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/" />"
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 lib:
> require ''my_utils''
=> true
> include MyUtils
=> Object
> MyUtils.say "hi"
evaluate: hi
=> true
Un posible enfoque para la prueba del método de ayuda en la consola de rieles es
Struct.new(:t).extend(YourHelper).your_method(*arg)
y para recargar y hacer
reload!; Struct.new(:t).extend(YourHelper).your_method(*arg)
Una forma fácil de llamar a una acción del controlador desde un 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 me funciona con Rails 2.1 y 2.3, no probé versiones anteriores.