Permalink
Browse files

Merge branch 'master' into i18n-merge

Conflicts:

	actionpack/lib/action_view/helpers/form_options_helper.rb
	activerecord/lib/active_record/validations.rb
  • Loading branch information...
jeremy committed Jul 17, 2008
2 parents 842917d + 99930d4 commit 636e6b7138864ceb1e309939cd879e710b287f3e
Showing with 1,950 additions and 296 deletions.
  1. +2 −2 actionmailer/lib/action_mailer/vendor/tmail-1.2.3/tmail/address.rb
  2. +1 −1 actionmailer/lib/action_mailer/vendor/tmail-1.2.3/tmail/header.rb
  3. +1 −1 actionmailer/lib/action_mailer/vendor/tmail-1.2.3/tmail/interface.rb
  4. +2 −2 actionmailer/lib/action_mailer/vendor/tmail-1.2.3/tmail/mail.rb
  5. +6 −0 actionpack/CHANGELOG
  6. +6 −12 actionpack/README
  7. +2 −4 actionpack/lib/action_controller/assertions/selector_assertions.rb
  8. +1 −1 actionpack/lib/action_controller/base.rb
  9. +1 −1 actionpack/lib/action_controller/caching/fragments.rb
  10. +10 −0 actionpack/lib/action_controller/cookies.rb
  11. +1 −1 actionpack/lib/action_controller/integration.rb
  12. +3 −7 actionpack/lib/action_controller/rack_process.rb
  13. +3 −3 actionpack/lib/action_controller/request.rb
  14. +1 −1 actionpack/lib/action_controller/request_forgery_protection.rb
  15. +16 −12 actionpack/lib/action_controller/rescue.rb
  16. +4 −0 actionpack/lib/action_controller/resources.rb
  17. +15 −8 actionpack/lib/action_controller/streaming.rb
  18. +23 −0 actionpack/lib/action_controller/test_case.rb
  19. +2 −2 actionpack/lib/action_controller/test_process.rb
  20. +2 −2 actionpack/lib/action_controller/vendor/html-scanner/html/selector.rb
  21. +5 −4 actionpack/lib/action_view/base.rb
  22. +1 −1 actionpack/lib/action_view/helpers/active_record_helper.rb
  23. +14 −11 actionpack/lib/action_view/helpers/asset_tag_helper.rb
  24. +9 −8 actionpack/lib/action_view/helpers/capture_helper.rb
  25. +2 −2 actionpack/lib/action_view/helpers/date_helper.rb
  26. +20 −13 actionpack/lib/action_view/helpers/debug_helper.rb
  27. +32 −3 actionpack/lib/action_view/helpers/form_helper.rb
  28. +19 −2 actionpack/lib/action_view/helpers/javascript_helper.rb
  29. +4 −3 actionpack/lib/action_view/helpers/prototype_helper.rb
  30. +1 −1 actionpack/lib/action_view/helpers/sanitize_helper.rb
  31. +1 −1 actionpack/lib/action_view/helpers/scriptaculous_helper.rb
  32. +1 −1 actionpack/lib/action_view/helpers/tag_helper.rb
  33. +1 −1 actionpack/lib/action_view/helpers/url_helper.rb
  34. +12 −4 actionpack/lib/action_view/paths.rb
  35. +31 −22 actionpack/lib/action_view/renderable.rb
  36. +1 −1 actionpack/test/abstract_unit.rb
  37. +20 −0 actionpack/test/controller/base_test.rb
  38. +49 −13 actionpack/test/controller/caching_test.rb
  39. +46 −4 actionpack/test/controller/cgi_test.rb
  40. +1 −1 actionpack/test/controller/cookie_test.rb
  41. +77 −4 actionpack/test/controller/rack_test.rb
  42. +9 −0 actionpack/test/controller/rescue_test.rb
  43. +3 −0 actionpack/test/fixtures/functional_caching/formatted_fragment_cached.html.erb
  44. +6 −0 actionpack/test/fixtures/functional_caching/formatted_fragment_cached.js.rjs
  45. +5 −0 actionpack/test/fixtures/functional_caching/formatted_fragment_cached.xml.builder
  46. +41 −0 actionpack/test/template/compiled_templates_test.rb
  47. +5 −1 actionpack/test/template/javascript_helper_test.rb
  48. +5 −1 actionpack/test/template/prototype_helper_test.rb
  49. +2 −0 activerecord/CHANGELOG
  50. +1 −1 activerecord/lib/active_record/association_preload.rb
  51. +4 −3 activerecord/lib/active_record/associations.rb
  52. +8 −5 activerecord/lib/active_record/base.rb
  53. +1 −1 activerecord/lib/active_record/callbacks.rb
  54. +1 −1 activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb
  55. +1 −1 activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb
  56. +6 −6 activerecord/lib/active_record/dirty.rb
  57. +16 −0 activerecord/lib/active_record/migration.rb
  58. +22 −22 activerecord/lib/active_record/validations.rb
  59. +1 −1 activeresource/README
  60. +11 −11 activeresource/lib/active_resource/base.rb
  61. +2 −2 activeresource/lib/active_resource/custom_methods.rb
  62. +1 −1 activeresource/lib/active_resource/http_mock.rb
  63. +15 −15 activesupport/lib/active_support/cache/mem_cache_store.rb
  64. +1 −1 activesupport/lib/active_support/core_ext/bigdecimal/conversions.rb
  65. +2 −1 activesupport/lib/active_support/core_ext/hash.rb
  66. +23 −0 activesupport/lib/active_support/core_ext/hash/deep_merge.rb
  67. +1 −1 activesupport/lib/active_support/core_ext/hash/except.rb
  68. +12 −5 activesupport/lib/active_support/core_ext/hash/reverse_merge.rb
  69. +5 −0 activesupport/lib/active_support/core_ext/hash/slice.rb
  70. +1 −0 activesupport/lib/active_support/core_ext/object.rb
  71. +8 −0 activesupport/lib/active_support/core_ext/object/metaclass.rb
  72. +2 −2 activesupport/lib/active_support/core_ext/string/inflections.rb
  73. +1 −1 activesupport/lib/active_support/core_ext/time/calculations.rb
  74. +1 −1 activesupport/lib/active_support/json.rb
  75. +9 −2 activesupport/lib/active_support/json/encoders/date.rb
  76. +9 −2 activesupport/lib/active_support/json/encoders/date_time.rb
  77. +10 −3 activesupport/lib/active_support/json/encoders/time.rb
  78. +1 −9 activesupport/lib/active_support/option_merger.rb
  79. +13 −1 activesupport/lib/active_support/time_with_zone.rb
  80. +1 −1 activesupport/lib/active_support/vendor/builder-2.1.2/builder/xmlevents.rb
  81. +2 −2 activesupport/lib/active_support/vendor/memcache-client-1.5.0/memcache.rb
  82. +1 −1 activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/data_timezone.rb
  83. +1 −1 activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/data_timezone_info.rb
  84. +1 −1 activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/linked_timezone.rb
  85. +1 −1 activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/timezone.rb
  86. +1 −1 activesupport/lib/active_support/vendor/tzinfo-0.3.9/tzinfo/timezone_transition_info.rb
  87. +3 −3 activesupport/lib/active_support/vendor/xml-simple-1.0.11/xmlsimple.rb
  88. +31 −0 activesupport/test/core_ext/hash_ext_test.rb
  89. +8 −0 activesupport/test/core_ext/object_and_class_ext_test.rb
  90. +27 −0 activesupport/test/option_merger_test.rb
  91. +17 −0 railties/config.ru
  92. +91 −0 railties/doc/guides/actionview/helpers.markdown
  93. +90 −0 railties/doc/guides/actionview/partials.markdown
  94. +56 −0 railties/doc/guides/activerecord/basics.markdown
  95. +861 −0 railties/doc/guides/creating_plugins/basics.markdown
  96. +0 −1 railties/environments/production.rb
  97. +2 −2 railties/lib/commands/process/spawner.rb
  98. +7 −4 railties/lib/initializer.rb
  99. +0 −1 railties/lib/performance_test_help.rb
  100. +16 −1 railties/lib/rails_generator/commands.rb
  101. +1 −0 railties/lib/rails_generator/generators/applications/app/app_generator.rb
  102. +9 −5 railties/lib/rails_generator/generators/components/scaffold/USAGE
  103. +1 −1 railties/lib/rails_generator/scripts.rb
  104. +6 −7 railties/lib/rails_generator/scripts/destroy.rb
  105. +1 −1 railties/lib/rails_generator/secret_key_generator.rb
  106. +1 −1 railties/test/generators/generator_test_helper.rb
@@ -38,7 +38,7 @@ module TMail
# = Class Address
#
# Provides a complete handling library for email addresses. Can parse a string of an
- # address directly or take in preformatted addresses themseleves. Allows you to add
+ # address directly or take in preformatted addresses themselves. Allows you to add
# and remove phrases from the front of the address and provides a compare function for
# email addresses.
#
@@ -143,7 +143,7 @@ def initialize( local, domain )
# This is to catch an unquoted "@" symbol in the local part of the
# address. Handles addresses like <"@"@me.com> and makes sure they
- # stay like <"@"@me.com> (previously were becomming <@@me.com>)
+ # stay like <"@"@me.com> (previously were becoming <@@me.com>)
if local && (local.join == '@' || local.join =~ /\A[^"].*?@.*?[^"]\Z/)
@local = "\"#{local.join}\""
else
@@ -59,7 +59,7 @@ def new( name, body, conf = DEFAULT_CONFIG )
#
# This is because a mailbox doesn't have the : after the From that designates the
# beginning of the envelope sender (which can be different to the from address of
- # the emial)
+ # the email)
#
# Other fields can be passed as normal, "Reply-To", "Received" etc.
#
@@ -42,7 +42,7 @@ class Mail
# Allows you to query the mail object with a string to get the contents
# of the field you want.
#
- # Returns a string of the exact contnts of the field
+ # Returns a string of the exact contents of the field
#
# mail.from = "mikel <mikel@lindsaar.net>"
# mail.header_string("From") #=> "mikel <mikel@lindsaar.net>"
@@ -255,7 +255,7 @@ def sub_header(key, param)
alias fetch []
# Allows you to set or delete TMail header objects at will.
- # Eamples:
+ # Examples:
# @mail = TMail::Mail.new
# @mail['to'].to_s # => 'mikel@test.com.au'
# @mail['to'] = 'mikel@elsewhere.org'
@@ -265,7 +265,7 @@ def sub_header(key, param)
# @mail['to'].to_s # => nil
# @mail.encoded # => "\r\n"
#
- # Note: setting mail[] = nil actualy deletes the header field in question from the object,
+ # Note: setting mail[] = nil actually deletes the header field in question from the object,
# it does not just set the value of the hash to nil
def []=( key, val )
dkey = key.downcase
View
@@ -1,5 +1,11 @@
*Edge*
+* All 2xx requests are considered successful [Josh Peek]
+
+* Fixed that AssetTagHelper#compute_public_path shouldn't cache the asset_host along with the source or per-request proc's won't run [DHH]
+
+* Removed config.action_view.cache_template_loading, use config.cache_classes instead [Josh Peek]
+
* Get buffer for fragment cache from template's @output_buffer [Josh Peek]
* Set config.action_view.warn_cache_misses = true to receive a warning if you perform an action that results in an expensive disk operation that could be cached [Josh Peek]
View
@@ -31,7 +31,7 @@ http://www.rubyonrails.org.
A short rundown of the major features:
* Actions grouped in controller as methods instead of separate command objects
- and can therefore share helper methods.
+ and can therefore share helper methods
BlogController < ActionController::Base
def show
@@ -168,7 +168,7 @@ A short rundown of the major features:
{Learn more}[link:classes/ActionController/Base.html]
-* Javascript and Ajax integration.
+* Javascript and Ajax integration
link_to_function "Greeting", "alert('Hello world!')"
link_to_remote "Delete this post", :update => "posts",
@@ -177,7 +177,7 @@ A short rundown of the major features:
{Learn more}[link:classes/ActionView/Helpers/JavaScriptHelper.html]
-* Pagination for navigating lists of results.
+* Pagination for navigating lists of results
# controller
def list
@@ -192,23 +192,17 @@ A short rundown of the major features:
{Learn more}[link:classes/ActionController/Pagination.html]
-* Easy testing of both controller and template result through TestRequest/Response
-
- class LoginControllerTest < Test::Unit::TestCase
- def setup
- @controller = LoginController.new
- @request = ActionController::TestRequest.new
- @response = ActionController::TestResponse.new
- end
+* Easy testing of both controller and rendered template through ActionController::TestCase
+ class LoginControllerTest < ActionController::TestCase
def test_failing_authenticate
process :authenticate, :user_name => "nop", :password => ""
assert flash.has_key?(:alert)
assert_redirected_to :action => "index"
end
end
- {Learn more}[link:classes/ActionController/TestRequest.html]
+ {Learn more}[link:classes/ActionController/TestCase.html]
* Automated benchmarking and integrated logging
@@ -21,10 +21,8 @@ module Assertions
# from the response HTML or elements selected by the enclosing assertion.
#
# In addition to HTML responses, you can make the following assertions:
- # * +assert_select_rjs+ - Assertions on HTML content of RJS update and
- # insertion operations.
- # * +assert_select_encoded+ - Assertions on HTML encoded inside XML,
- # for example for dealing with feed item descriptions.
+ # * +assert_select_rjs+ - Assertions on HTML content of RJS update and insertion operations.
+ # * +assert_select_encoded+ - Assertions on HTML encoded inside XML, for example for dealing with feed item descriptions.
# * +assert_select_email+ - Assertions on the HTML body of an e-mail.
#
# Also see HTML::Selector to learn how to use selectors.
@@ -1155,7 +1155,7 @@ def initialize_current_url
def log_processing
if logger && logger.info?
- logger.info "\n\nProcessing #{controller_class_name}\##{action_name} (for #{request_origin}) [#{request.method.to_s.upcase}]"
+ logger.info "\n\nProcessing #{self.class.name}\##{action_name} (for #{request_origin}) [#{request.method.to_s.upcase}]"
logger.info " Session ID: #{@_session.session_id}" if @_session and @_session.respond_to?(:session_id)
logger.info " Parameters: #{respond_to?(:filter_parameters) ? filter_parameters(params).inspect : params.inspect}"
end
@@ -2,7 +2,7 @@ module ActionController #:nodoc:
module Caching
# Fragment caching is used for caching various blocks within templates without caching the entire action as a whole. This is useful when
# certain elements of an action change frequently or depend on complicated state while other parts rarely change or can be shared amongst multiple
- # parties. The caching is doing using the cache helper available in the Action View. A template with caching might look something like:
+ # parties. The caching is done using the cache helper available in the Action View. A template with caching might look something like:
#
# <b>Hello <%= @name %></b>
# <% cache do %>
@@ -22,6 +22,16 @@ module ActionController #:nodoc:
#
# cookies.delete :user_name
#
+ # Please note that if you specify a :domain when setting a cookie, you must also specify the domain when deleting the cookie:
+ #
+ # cookies[:key] = {
+ # :value => 'a yummy cookie',
+ # :expires => 1.year.from_now,
+ # :domain => 'domain.com'
+ # }
+ #
+ # cookies.delete(:key, :domain => 'domain.com')
+ #
# The option symbols for setting cookies are:
#
# * <tt>:value</tt> - The cookie's value or list of values (as an array).
@@ -101,7 +101,7 @@ def https!(flag=true)
@https = flag
end
- # Return +true+ if the session is mimicing a secure HTTPS request.
+ # Return +true+ if the session is mimicking a secure HTTPS request.
#
# if session.https?
# ...
@@ -24,7 +24,7 @@ def initialize(env, session_options = DEFAULT_SESSION_OPTIONS)
super()
end
- %w[ AUTH_TYPE CONTENT_TYPE GATEWAY_INTERFACE PATH_INFO
+ %w[ AUTH_TYPE GATEWAY_INTERFACE PATH_INFO
PATH_TRANSLATED QUERY_STRING REMOTE_HOST
REMOTE_IDENT REMOTE_USER SCRIPT_NAME
SERVER_NAME SERVER_PROTOCOL
@@ -98,10 +98,6 @@ def remote_addr
@env['REMOTE_ADDR']
end
- def request_method
- @env['REQUEST_METHOD'].downcase.to_sym
- end
-
def server_port
@env['SERVER_PORT'].to_i
end
@@ -250,11 +246,11 @@ def normalize_headers(options = "text/html")
headers['Content-Language'] = options.delete('language') if options['language']
headers['Expires'] = options.delete('expires') if options['expires']
- @status = options['Status'] || "200 OK"
+ @status = options.delete('Status') || "200 OK"
# Convert 'cookie' header to 'Set-Cookie' headers.
# Because Set-Cookie header can appear more the once in the response body,
- # we store it in a line break seperated string that will be translated to
+ # we store it in a line break separated string that will be translated to
# multiple Set-Cookie header by the handler.
if cookie = options.delete('cookie')
cookies = []
@@ -61,7 +61,7 @@ def head?
request_method == :head
end
- # Provides acccess to the request's HTTP headers, for example:
+ # Provides access to the request's HTTP headers, for example:
# request.headers["Content-Type"] # => "text/plain"
def headers
@headers ||= ActionController::Http::Headers.new(@env)
@@ -265,7 +265,7 @@ def subdomains(tld_length = 1)
parts[0..-(tld_length+2)]
end
- # Return the query string, accounting for server idiosyncracies.
+ # Return the query string, accounting for server idiosyncrasies.
def query_string
if uri = @env['REQUEST_URI']
uri.split('?', 2)[1] || ''
@@ -274,7 +274,7 @@ def query_string
end
end
- # Return the request URI, accounting for server idiosyncracies.
+ # Return the request URI, accounting for server idiosyncrasies.
# WEBrick includes the full URL. IIS leaves REQUEST_URI blank.
def request_uri
if uri = @env['REQUEST_URI']
@@ -17,7 +17,7 @@ def self.included(base)
# forged link from another site, is done by embedding a token based on the session (which an attacker wouldn't know) in all
# forms and Ajax requests generated by Rails and then verifying the authenticity of that token in the controller. Only
# HTML/JavaScript requests are checked, so this will not protect your XML API (presumably you'll have a different authentication
- # scheme there anyway). Also, GET requests are not protected as these should be indempotent anyway.
+ # scheme there anyway). Also, GET requests are not protected as these should be idempotent anyway.
#
# This is turned on with the <tt>protect_from_forgery</tt> method, which will check the token and raise an
# ActionController::InvalidAuthenticityToken if it doesn't match what was expected. You can customize the error message in
@@ -112,19 +112,23 @@ def rescue_from(*klasses, &block)
protected
# Exception handler called when the performance of an action raises an exception.
def rescue_action(exception)
- log_error(exception) if logger
- erase_results if performed?
+ if handler_for_rescue(exception)
+ rescue_action_with_handler(exception)
+ else
+ log_error(exception) if logger
+ erase_results if performed?
- # Let the exception alter the response if it wants.
- # For example, MethodNotAllowed sets the Allow header.
- if exception.respond_to?(:handle_response!)
- exception.handle_response!(response)
- end
+ # Let the exception alter the response if it wants.
+ # For example, MethodNotAllowed sets the Allow header.
+ if exception.respond_to?(:handle_response!)
+ exception.handle_response!(response)
+ end
- if consider_all_requests_local || local_request?
- rescue_action_locally(exception)
- else
- rescue_action_in_public(exception)
+ if consider_all_requests_local || local_request?
+ rescue_action_locally(exception)
+ else
+ rescue_action_in_public(exception)
+ end
end
end
@@ -200,7 +204,7 @@ def rescue_action_with_handler(exception)
def perform_action_with_rescue #:nodoc:
perform_action_without_rescue
rescue Exception => exception
- rescue_action_with_handler(exception) || rescue_action(exception)
+ rescue_action(exception)
end
def rescues_path(template_name)
@@ -296,6 +296,10 @@ def initialize(entity, options)
# article_comments_url(:article_id => @article)
# article_comment_url(:article_id => @article, :id => @comment)
#
+ # If you don't want to load all objects from the database you might want to use the <tt>article_id</tt> directly:
+ #
+ # articles_comments_url(@comment.article_id, @comment)
+ #
# * <tt>:name_prefix</tt> - Define a prefix for all generated routes, usually ending in an underscore.
# Use this if you have named routes that may clash.
#
@@ -12,19 +12,21 @@ module Streaming
X_SENDFILE_HEADER = 'X-Sendfile'.freeze
protected
- # Sends the file by streaming it 4096 bytes at a time. This way the
- # whole file doesn't need to be read into memory at once. This makes
- # it feasible to send even large files.
+ # Sends the file, by default streaming it 4096 bytes at a time. This way the
+ # whole file doesn't need to be read into memory at once. This makes it
+ # feasible to send even large files. You can optionally turn off streaming
+ # and send the whole file at once.
#
- # Be careful to sanitize the path parameter if it coming from a web
+ # Be careful to sanitize the path parameter if it is coming from a web
# page. <tt>send_file(params[:path])</tt> allows a malicious user to
# download any file on your server.
#
# Options:
# * <tt>:filename</tt> - suggests a filename for the browser to use.
# Defaults to <tt>File.basename(path)</tt>.
- # * <tt>:type</tt> - specifies an HTTP content type.
- # Defaults to 'application/octet-stream'.
+ # * <tt>:type</tt> - specifies an HTTP content type. Defaults to 'application/octet-stream'.
+ # * <tt>:length</tt> - used to manually override the length (in bytes) of the content that
+ # is going to be sent to the client. Defaults to <tt>File.size(path)</tt>.
# * <tt>:disposition</tt> - specifies whether the file will be shown inline or downloaded.
# Valid values are 'inline' and 'attachment' (default).
# * <tt>:stream</tt> - whether to send the file to the user agent as it is read (+true+)
@@ -35,6 +37,12 @@ module Streaming
# * <tt>:url_based_filename</tt> - set to +true+ if you want the browser guess the filename from
# the URL, which is necessary for i18n filenames on certain browsers
# (setting <tt>:filename</tt> overrides this option).
+ # * <tt>:x_sendfile</tt> - uses X-Sendfile to send the file when set to +true+. This is currently
+ # only available with Lighttpd/Apache2 and specific modules installed and activated. Since this
+ # uses the web server to send the file, this may lower memory consumption on your server and
+ # it will not block your application for further requests.
+ # See http://blog.lighttpd.net/articles/2006/07/02/x-sendfile and
+ # http://tn123.ath.cx/mod_xsendfile/ for details. Defaults to +false+.
#
# The default Content-Type and Content-Disposition headers are
# set to download arbitrary binary files in as many browsers as
@@ -99,8 +107,7 @@ def send_file(path, options = {}) #:doc:
#
# Options:
# * <tt>:filename</tt> - suggests a filename for the browser to use.
- # * <tt>:type</tt> - specifies an HTTP content type.
- # Defaults to 'application/octet-stream'.
+ # * <tt>:type</tt> - specifies an HTTP content type. Defaults to 'application/octet-stream'.
# * <tt>:disposition</tt> - specifies whether the file will be shown inline or downloaded.
# Valid values are 'inline' and 'attachment' (default).
# * <tt>:status</tt> - specifies the status code to send with the response. Defaults to '200 OK'.
@@ -15,6 +15,27 @@ def inferred_controller_name
end
end
+ # Superclass for Action Controller functional tests. Infers the controller under test from the test class name,
+ # and creates @controller, @request, @response instance variables.
+ #
+ # class WidgetsControllerTest < ActionController::TestCase
+ # def test_index
+ # get :index
+ # end
+ # end
+ #
+ # * @controller - WidgetController.new
+ # * @request - ActionController::TestRequest.new
+ # * @response - ActionController::TestResponse.new
+ #
+ # (Earlier versions of Rails required each functional test to subclass Test::Unit::TestCase and define
+ # @controller, @request, @response in +setup+.)
+ #
+ # If the controller cannot be inferred from the test class name, you can explicity set it with +tests+.
+ #
+ # class SpecialEdgeCaseWidgetsControllerTest < ActionController::TestCase
+ # tests WidgetController
+ # end
class TestCase < ActiveSupport::TestCase
# When the request.remote_addr remains the default for testing, which is 0.0.0.0, the exception is simply raised inline
# (bystepping the regular exception handling from rescue_action). If the request.remote_addr is anything else, the regular
@@ -41,6 +62,8 @@ def rescue_action(e)
@@controller_class = nil
class << self
+ # Sets the controller class name. Useful if the name can't be inferred from test class.
+ # Expects +controller_class+ as a constant. Example: <tt>tests WidgetController</tt>.
def tests(controller_class)
self.controller_class = controller_class
end
Oops, something went wrong.

0 comments on commit 636e6b7

Please sign in to comment.