I have an odd error. I have the following module:
module ActionController module SslSupport
def self.included(base) raise "#{base} does not define url_for" unless base.method_defined?(:url_for) unless base.respond_to?(:url_for_without_ssl_supprt) base.send :include, InstanceMethods base.send :alias_method_chain, :url_for, :ssl_support end end
module InstanceMethods
def url_for_with_ssl_support(options) new_options = options.dup
if options.kind_of?(Hash) new_options.merge!({ :only_path => false }) if request.ssl? ^ url_ssl?(new_options) if url_ssl?(new_options) new_options.merge!({ :protocol => 'https' }) if ['development'].include?(ENV['RAILS_ENV']) new_options.merge!({ :port => 3001, :host => request.host }) end end new_options.delete(:ssl) end
url_for_without_ssl_support(new_options) end
private
def url_ssl?(options) case options when Hash protocol = options[:protocol] || 'http://' return options[:ssl] || protocol =~ /^https/ when String return options =~ /^https/ else return self.class.method_defined?(:request) ? request.ssl? : false end end
end
end end
It is included in app/controllers/application.rb and in ActionView::Base. If I run
ruby test/functional/people_controller_test.rb or ruby test/functional/ account_controller_test.rb, everything runs fine. If I run rake test:functionals, however, I get a "stack level too deep" within url_for within those two test classes.
Example output:
test_spec {The Account controller A guest (in general)} 001 [should be able to view the sign-up page](The Account controller A guest (in general)): ActionView::TemplateError: stack level too deep On line #8 of app/views/account/start.rhtml
5: <h1>Create a free account in three steps:</h1> 6: 7: <ol> 8: <li>a. <%= link_to 'Choose', :action => 'choose' %></li> 9: <li>b. Create</li> 10: <li>c. Customize</li> 11: </ol> lib/action_controller/ssl_support.rb:36:in `url_ssl?' lib/action_controller/ssl_support.rb:19:in `url_for_without_ssl_support' lib/action_controller/ssl_support.rb:28:in `url_for' vendor/rails/actionpack/lib/action_view/helpers/url_helper.rb: 70:in `send' vendor/rails/actionpack/lib/action_view/helpers/url_helper.rb: 70:in `url_for_without_ssl_support' lib/action_controller/ssl_support.rb:28:in `url_for' vendor/rails/actionpack/lib/action_view/helpers/url_helper.rb: 136:in `link_to'
I figured that my self.included(base) would guard against this, but it doesn't seem to work. Any thoughts?
-Gaius