当我加载脚本/控制台时,有时我想使用控制器或视图助手方法的输出。

有没有办法:

模拟一个请求? 从控制器实例调用方法说请求? 测试助手方法,无论是通过所说的控制器实例或其他方式?


当前回答

这里有一种方法可以通过控制台做到这一点:

>> 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>"

创建ActionView::Base的新实例可以让你访问你的助手可能使用的普通视图方法。然后扩展YourHelperModule,将它的方法混合到你的对象中,让你查看它们的返回值。

其他回答

前面的答案是调用助手,但下面的答案将有助于调用控制器方法。我已经在Ruby on Rails 2.3.2上使用了这个功能。

首先将以下代码添加到.irbrc文件(可以在您的主目录中)

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

然后在Ruby on Rails控制台中,您可以键入类似于……

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

...HTML将被转储到控制台。

在Ruby on Rails 3中,试试这个:

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

主体将包含URL的HTML。

如何路由和呈现(调度)从一个模型在Ruby on Rails 3

要调用helper,请使用helper对象:

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

如果你想使用一个默认情况下没有包含的helper(比如,因为你从ApplicationController中删除了helper:all),只需要包含这个helper。

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

至于如何处理控制器,我引用Nick的回答:

get '/posts/1' > response = app.response #您现在有了一个rails响应对象,就像集成测试一样 >反应。body #给你HTML >反应。cookie #散列的cookie # etc, etc

你可以像下面这样在Ruby on Rails控制台中访问你的方法:

controller.method_name
helper.method_name

另一种方法是使用Ruby on Rails调试器。http://guides.rubyonrails.org/debugging_rails_applications.html上有一个关于调试的Ruby on Rails指南

基本上,使用-u选项启动服务器:

./script/server -u

然后在脚本中插入一个断点,在这个断点中您可以访问控制器、助手等。

class EventsController < ApplicationController
  def index
    debugger
  end
end

当您发出请求并点击代码中的该部分时,服务器控制台将返回一个提示符,然后您可以从命令提示符发出请求、查看对象等。完成后,只需输入'cont'继续执行。也有扩展调试的选项,但这至少可以让您开始。