如何从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¶meter2=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)