如何从Rails中的控制台调用控制器/视图方法?

当我加载script/console ,有时候我想玩控制器的输出或视图帮助器方法。

有什么方法可以:

  • 模拟请求?
  • 在所述请求上从控制器实例调用方法?
  • testing助手方法,要么通过所述控制器实例或另一种方式?

要调用帮助器,请使用helper对象:

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

如果你想使用一个默认不包含的帮助器(比如说,因为你从ApplicationController删除了helper :all的帮助器),只需要包含帮助器即可。

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

至于处理控制器 ,我引用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 

从脚本/控制台调用控制器操作并查看/操作响应对象的简单方法是:

 > 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 

应用程序对象是ActionController :: Integration :: Session的一个实例

这对我使用Rails 2.1和2.3,我没有尝试早期版本。

如果您需要从控制台进行testing(在Rails 3.1和4.1上进行testing):

呼叫控制器操作:

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

ApplicationController方法:

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

路线助手:

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

查看助手:

 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=\"http://img.dovov.comlogo.png\" />" 

渲染:

 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' 

ActiveSupport方法:

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

Lib模块:

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

以下是通过控制台执行此操作的一种方法:

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

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

另一种方法是使用railsdebugging器。 在http://guides.rubyonrails.org/debugging_rails_applications.html有关于debugging的Rails指南;

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

 ./script/server -u 

然后插入一个断点到您想要访问控制器/助手/等的脚本。

 class EventsController < ApplicationController def index debugger end end 

当你发出一个请求并在代码中input这个部分时,服务器控制台将返回一个提示,然后你可以在命令提示符下发出请求,查看对象等。 完成后,只需input“cont”继续执行。 也有扩展debugging的选项,但这至less应该让你开始。

如果方法是POST方法那么

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

[这里的参数将按照你的适用性]

否则,如果它是GET方法然后

 app.get 'controller/action' 

你可以像Rails Console一样访问你的方法

 controller.method_name helper.method_name 

以下是如何使用Refinery作为示例进行已authentication的POST请求:

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

如果遇到错误,您可能也会发现这些内容有用:

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

在rails 3中,试试这个:

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

Body将包含url的HTML。

如何从Rails 3中的模型路由和渲染(dispatch)

较早的答案是调用助手,但以下将有助于调用控制器方法。 我在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 

那么在轨道控制台,你可以键入类似的东西…

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

…和HTML将被转储到控制台。

在控制台控制台中进行Helper方法testing的一个可能的方法是

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

并重新加载和做

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