From 3f8409193716669b9fa61ac74ae1c92cfde00785 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Valim?= Date: Fri, 29 Jan 2010 16:16:01 +0100 Subject: ActionMailer should depend just on AbstractController. --- actionpack/lib/abstract_controller/url_for.rb | 156 -------------------------- 1 file changed, 156 deletions(-) delete mode 100644 actionpack/lib/abstract_controller/url_for.rb (limited to 'actionpack/lib/abstract_controller') diff --git a/actionpack/lib/abstract_controller/url_for.rb b/actionpack/lib/abstract_controller/url_for.rb deleted file mode 100644 index 6b7d2b1f34..0000000000 --- a/actionpack/lib/abstract_controller/url_for.rb +++ /dev/null @@ -1,156 +0,0 @@ -module AbstractController - # In routes.rb one defines URL-to-controller mappings, but the reverse - # is also possible: an URL can be generated from one of your routing definitions. - # URL generation functionality is centralized in this module. - # - # See AbstractController::Routing and AbstractController::Resources for general - # information about routing and routes.rb. - # - # Tip: If you need to generate URLs from your models or some other place, - # then AbstractController::UrlFor is what you're looking for. Read on for - # an introduction. - # - # == URL generation from parameters - # - # As you may know, some functions - such as AbstractController::Base#url_for - # and ActionView::Helpers::UrlHelper#link_to, can generate URLs given a set - # of parameters. For example, you've probably had the chance to write code - # like this in one of your views: - # - # <%= link_to('Click here', :controller => 'users', - # :action => 'new', :message => 'Welcome!') %> - # - # #=> Generates a link to: /users/new?message=Welcome%21 - # - # link_to, and all other functions that require URL generation functionality, - # actually use AbstractController::UrlFor under the hood. And in particular, - # they use the AbstractController::UrlFor#url_for method. One can generate - # the same path as the above example by using the following code: - # - # include UrlFor - # url_for(:controller => 'users', - # :action => 'new', - # :message => 'Welcome!', - # :only_path => true) - # # => "/users/new?message=Welcome%21" - # - # Notice the :only_path => true part. This is because UrlFor has no - # information about the website hostname that your Rails app is serving. So if you - # want to include the hostname as well, then you must also pass the :host - # argument: - # - # include UrlFor - # url_for(:controller => 'users', - # :action => 'new', - # :message => 'Welcome!', - # :host => 'www.example.com') # Changed this. - # # => "http://www.example.com/users/new?message=Welcome%21" - # - # By default, all controllers and views have access to a special version of url_for, - # that already knows what the current hostname is. So if you use url_for in your - # controllers or your views, then you don't need to explicitly pass the :host - # argument. - # - # For convenience reasons, mailers provide a shortcut for AbstractController::UrlFor#url_for. - # So within mailers, you only have to type 'url_for' instead of 'AbstractController::UrlFor#url_for' - # in full. However, mailers don't have hostname information, and what's why you'll still - # have to specify the :host argument when generating URLs in mailers. - # - # - # == URL generation for named routes - # - # UrlFor also allows one to access methods that have been auto-generated from - # named routes. For example, suppose that you have a 'users' resource in your - # routes.rb: - # - # map.resources :users - # - # This generates, among other things, the method users_path. By default, - # this method is accessible from your controllers, views and mailers. If you need - # to access this auto-generated method from other places (such as a model), then - # you can do that by including AbstractController::UrlFor in your class: - # - # class User < ActiveRecord::Base - # include AbstractController::UrlFor - # - # def base_uri - # user_path(self) - # end - # end - # - # User.find(1).base_uri # => "/users/1" - # - module UrlFor - extend ActiveSupport::Concern - - included do - ActionController::Routing::Routes.install_helpers(self) - extlib_inheritable_accessor :default_url_options, - :instance_writer => false, :instance_reader => false - self.default_url_options ||= {} - end - - # Overwrite to implement a number of default options that all url_for-based methods will use. The default options should come in - # the form of a hash, just like the one you would use for url_for directly. Example: - # - # def default_url_options(options) - # { :project => @project.active? ? @project.url_name : "unknown" } - # end - # - # As you can infer from the example, this is mostly useful for situations where you want to centralize dynamic decisions about the - # urls as they stem from the business domain. Please note that any individual url_for call can always override the defaults set - # by this method. - def default_url_options(options = nil) - self.class.default_url_options - end - - def rewrite_options(options) #:nodoc: - if options.delete(:use_defaults) != false && (defaults = default_url_options(options)) - defaults.merge(options) - else - options - end - end - - # Generate a url based on the options provided, default_url_options and the - # routes defined in routes.rb. The following options are supported: - # - # * :only_path - If true, the relative url is returned. Defaults to +false+. - # * :protocol - The protocol to connect to. Defaults to 'http'. - # * :host - Specifies the host the link should be targeted at. - # If :only_path is false, this option must be - # provided either explicitly, or via +default_url_options+. - # * :port - Optionally specify the port to connect to. - # * :anchor - An anchor name to be appended to the path. - # * :skip_relative_url_root - If true, the url is not constructed using the - # +relative_url_root+ set in AbstractController::Base.relative_url_root. - # * :trailing_slash - If true, adds a trailing slash, as in "/archive/2009/" - # - # Any other key (:controller, :action, etc.) given to - # +url_for+ is forwarded to the Routes module. - # - # Examples: - # - # url_for :controller => 'tasks', :action => 'testing', :host=>'somehost.org', :port=>'8080' # => 'http://somehost.org:8080/tasks/testing' - # url_for :controller => 'tasks', :action => 'testing', :host=>'somehost.org', :anchor => 'ok', :only_path => true # => '/tasks/testing#ok' - # url_for :controller => 'tasks', :action => 'testing', :trailing_slash=>true # => 'http://somehost.org/tasks/testing/' - # url_for :controller => 'tasks', :action => 'testing', :host=>'somehost.org', :number => '33' # => 'http://somehost.org/tasks/testing?number=33' - def url_for(options = {}) - options ||= {} - case options - when String - options - when Hash - _url_rewriter.rewrite(rewrite_options(options)) - else - polymorphic_url(options) - end - end - - protected - - def _url_rewriter - ActionController::UrlRewriter - end - end -end -- cgit v1.2.3 From 986a4e616be715e5c5a6ebbd25d339fa9bba4072 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Valim?= Date: Fri, 29 Jan 2010 16:49:26 +0100 Subject: Fix rendering of layouts. --- actionpack/lib/abstract_controller/rendering.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'actionpack/lib/abstract_controller') diff --git a/actionpack/lib/abstract_controller/rendering.rb b/actionpack/lib/abstract_controller/rendering.rb index 1dec3f2c3e..40cac40ba7 100644 --- a/actionpack/lib/abstract_controller/rendering.rb +++ b/actionpack/lib/abstract_controller/rendering.rb @@ -157,7 +157,8 @@ module AbstractController options[:_template_name] = options[:file] end - name = (options[:_template_name] || action_name).to_s + name = (options[:_template_name] || options[:action] || action_name).to_s + options[:_prefix] ||= _prefix if (options.keys & [:partial, :file, :template]).empty? options[:_template] ||= with_template_cache(name) do find_template(name, { :formats => formats }, options) -- cgit v1.2.3 From cc2642b220958894c5a384530f32f622f76cd097 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Valim?= Date: Fri, 29 Jan 2010 17:21:31 +0100 Subject: Added :format and :locale options to render. --- actionpack/lib/abstract_controller/rendering.rb | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) (limited to 'actionpack/lib/abstract_controller') diff --git a/actionpack/lib/abstract_controller/rendering.rb b/actionpack/lib/abstract_controller/rendering.rb index 40cac40ba7..ac407bda5e 100644 --- a/actionpack/lib/abstract_controller/rendering.rb +++ b/actionpack/lib/abstract_controller/rendering.rb @@ -160,11 +160,20 @@ module AbstractController name = (options[:_template_name] || options[:action] || action_name).to_s options[:_prefix] ||= _prefix if (options.keys & [:partial, :file, :template]).empty? + details = _normalize_details(options) + options[:_template] ||= with_template_cache(name) do - find_template(name, { :formats => formats }, options) + find_template(name, details, options) end end + def _normalize_details(options) + details = { :formats => formats } + details[:formats] = Array(options[:format]) if options[:format] + details[:locale] = Array(options[:locale]) if options[:locale] + details + end + def find_template(name, details, options) view_paths.find(name, details, options[:_prefix], options[:_partial]) end -- cgit v1.2.3 From 0e063f435ce31a091d1097156172d551bd9d9d37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Valim?= Date: Sat, 30 Jan 2010 16:35:22 +0100 Subject: Fix some backward incompatible behavior on AM. --- actionpack/lib/abstract_controller/compatibility.rb | 18 ++++++++++++++++++ actionpack/lib/abstract_controller/helpers.rb | 12 +++++++++++- 2 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 actionpack/lib/abstract_controller/compatibility.rb (limited to 'actionpack/lib/abstract_controller') diff --git a/actionpack/lib/abstract_controller/compatibility.rb b/actionpack/lib/abstract_controller/compatibility.rb new file mode 100644 index 0000000000..7fb93a0eb5 --- /dev/null +++ b/actionpack/lib/abstract_controller/compatibility.rb @@ -0,0 +1,18 @@ +module AbstractController + module Compatibility + extend ActiveSupport::Concern + + def _find_layout(name, details) + details[:prefix] = nil if name =~ /\blayouts/ + super + end + + # Move this into a "don't run in production" module + def _default_layout(details, require_layout = false) + super + rescue ActionView::MissingTemplate + _find_layout(_layout({}), {}) + nil + end + end +end diff --git a/actionpack/lib/abstract_controller/helpers.rb b/actionpack/lib/abstract_controller/helpers.rb index 1d898d1a4c..eb621c0865 100644 --- a/actionpack/lib/abstract_controller/helpers.rb +++ b/actionpack/lib/abstract_controller/helpers.rb @@ -25,7 +25,7 @@ module AbstractController def inherited(klass) helpers = _helpers klass._helpers = Module.new { include helpers } - + klass.class_eval { default_helper_module! unless name.blank? } super end @@ -146,6 +146,16 @@ module AbstractController end end end + + def default_helper_module! + module_name = name.sub(/Controller$/, '') + module_path = module_name.underscore + helper module_path + rescue MissingSourceFile => e + raise e unless e.is_missing? "helpers/#{module_path}_helper" + rescue NameError => e + raise e unless e.missing_name? "#{module_name}Helper" + end end end end -- cgit v1.2.3