Moved require_association to associations.rb and added methods for resetting the inheritable attributes on subclasses
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@125 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
This commit is contained in:
parent
b141bdbb32
commit
8e1f1ee442
@ -1,5 +1,7 @@
|
||||
*SVN*
|
||||
|
||||
* Added display of error messages with scaffolded form pages
|
||||
|
||||
* Added option to ERB templates to swallow newlines by using <% if something -%> instead of just <% if something %>. Example:
|
||||
|
||||
class SomeController < AbstractApplicationController
|
||||
|
@ -28,6 +28,10 @@ def read_inheritable_attribute(key)
|
||||
inheritable_attributes[key]
|
||||
end
|
||||
|
||||
def reset_inheritable_attributes
|
||||
inheritable_attributes.clear
|
||||
end
|
||||
|
||||
private
|
||||
def inherited(child)
|
||||
@@classes[child] = inheritable_attributes.dup
|
||||
|
@ -3,6 +3,10 @@
|
||||
require 'active_record/associations/has_and_belongs_to_many_association'
|
||||
require 'active_record/deprecated_associations'
|
||||
|
||||
unless Object.respond_to?(:require_association)
|
||||
Object.send(:define_method, :require_association) { |file_name| ActiveRecord::Base.require_association(file_name) }
|
||||
end
|
||||
|
||||
module ActiveRecord
|
||||
module Associations # :nodoc:
|
||||
def self.append_features(base)
|
||||
@ -447,6 +451,20 @@ def has_and_belongs_to_many(association_id, options = {})
|
||||
deprecated_has_collection_method(association_name)
|
||||
end
|
||||
|
||||
# Loads the <tt>file_name</tt> if reload_associations is true or requires if it's false.
|
||||
def require_association(file_name)
|
||||
if !associations_loaded.include?(file_name)
|
||||
associations_loaded << file_name
|
||||
reload_associations ? silence_warnings { load("#{file_name}.rb") } : require(file_name)
|
||||
end
|
||||
end
|
||||
|
||||
# Resets the list of dependencies loaded (typically to be called by the end of a request), so when require_association is
|
||||
# called for that dependency it'll be loaded anew.
|
||||
def reset_associations_loaded
|
||||
associations_loaded = []
|
||||
end
|
||||
|
||||
private
|
||||
# Raises an exception if an invalid option has been specified to prevent misspellings from slipping through
|
||||
def validate_options(valid_option_keys, supplied_option_keys)
|
||||
@ -571,4 +589,4 @@ def require_association_class(class_name)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
@ -3,10 +3,6 @@
|
||||
require 'active_record/support/inflector'
|
||||
require 'yaml'
|
||||
|
||||
unless Object.respond_to?(:require_association)
|
||||
Object.send(:define_method, :require_association) { |file_name| ActiveRecord::Base.require_association(file_name) }
|
||||
end
|
||||
|
||||
module ActiveRecord #:nodoc:
|
||||
class ActiveRecordError < StandardError #:nodoc:
|
||||
end
|
||||
@ -192,6 +188,10 @@ def self.inherited(child) #:nodoc:
|
||||
end
|
||||
|
||||
@@subclasses = {}
|
||||
|
||||
def self.subclasses
|
||||
@@subclasses.values.flatten
|
||||
end
|
||||
|
||||
cattr_accessor :configurations
|
||||
@@primary_key_prefix_type = {}
|
||||
@ -559,20 +559,6 @@ def benchmark(title)
|
||||
return result
|
||||
end
|
||||
|
||||
# Loads the <tt>file_name</tt> if reload_associations is true or requires if it's false.
|
||||
def require_association(file_name)
|
||||
if !associations_loaded.include?(file_name)
|
||||
associations_loaded << file_name
|
||||
reload_associations ? silence_warnings { load("#{file_name}.rb") } : require(file_name)
|
||||
end
|
||||
end
|
||||
|
||||
# Resets the list of dependencies loaded (typically to be called by the end of a request), so when require_association is
|
||||
# called for that dependency it'll be loaded anew.
|
||||
def reset_associations_loaded
|
||||
associations_loaded = []
|
||||
end
|
||||
|
||||
private
|
||||
# Finder methods must instantiate through this method to work with the single-table inheritance model
|
||||
# that makes it possible to create objects of different types from the same table.
|
||||
@ -840,16 +826,6 @@ def hash
|
||||
def respond_to?(method)
|
||||
self.class.column_methods_hash[method.to_sym] || respond_to_without_attributes?(method)
|
||||
end
|
||||
|
||||
# Loads the <tt>file_name</tt> if reload_associations is true or requires if it's false.
|
||||
def require_association(file_name)
|
||||
if !associations_loaded.include?(file_name)
|
||||
associations_loaded << file_name
|
||||
reload_associations ? silence_warnings { load("#{file_name}.rb") } : require(file_name)
|
||||
end
|
||||
end
|
||||
|
||||
Object.send(:define_method, :require_association) { |file_name| ActiveRecord::Base.require_association(file_name) }
|
||||
|
||||
private
|
||||
def create_or_update
|
||||
|
@ -28,10 +28,13 @@ def read_inheritable_attribute(key)
|
||||
inheritable_attributes[key]
|
||||
end
|
||||
|
||||
def reset_inheritable_attributes
|
||||
inheritable_attributes.clear
|
||||
end
|
||||
|
||||
private
|
||||
def inherited(child)
|
||||
@@classes[child] = inheritable_attributes.dup
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@ -34,15 +34,13 @@ link:files/vendor/actionpack/README.html.
|
||||
|
||||
* Apache 1.3.x or 2.x (or any FastCGI-capable webserver with a
|
||||
mod_rewrite-like module)
|
||||
* FastCGI (or mod_ruby) for production performance (CGI is used for
|
||||
development)
|
||||
* FastCGI (or mod_ruby) for better performance on Apache
|
||||
|
||||
== Getting started
|
||||
|
||||
1a. Setup Apache for the Rails application (see "Example for Apache conf")
|
||||
1b. Run the WEBrick servlet: <tt>ruby public/dispatch.servlet --help</tt>
|
||||
2. Go to http://rails/ (or whatever is your ServerName) and check
|
||||
that you get the "Congratulations, you're on Rails!" screen
|
||||
1. Run the WEBrick servlet: <tt>ruby public/dispatch.servlet</tt>
|
||||
(run with --help for options)
|
||||
2. Go to http://localhost:3000/ and get "Congratulations, you've put Ruby on Rails!"
|
||||
3. Follow the guidelines on the "Congratulations, you're on Rails!" screen
|
||||
|
||||
|
||||
@ -50,7 +48,7 @@ link:files/vendor/actionpack/README.html.
|
||||
|
||||
<VirtualHost *:80>
|
||||
ServerName rails
|
||||
DocumentRoot /path/tapplication/public/
|
||||
DocumentRoot /path/application/public/
|
||||
ErrorLog /path/application/log/apache.log
|
||||
|
||||
<Directory /path/application/public/>
|
||||
|
@ -53,8 +53,8 @@
|
||||
<small>Recommendation: Use *_development and *_test names, such as basecamp_development and basecamp_test</small><br/>
|
||||
<small>Warning: Don't point your test database at your development database, it'll destroy the latter on test runs!</small>
|
||||
<li>Edit config/database.yml with your database settings.
|
||||
<li>Create controllers and models using the generators in <code>script/new_*</code> <br/>
|
||||
<small>Help: Run a generator with no arguments for documentation</small>
|
||||
<li>Create controllers and models using the generator in <code>script/generate</code> <br/>
|
||||
<small>Help: Run the generator with no arguments for documentation</small>
|
||||
<li>See all the tests run by running <code>rake</code>.
|
||||
<li>Develop your Rails application!
|
||||
<li>Setup Apache with <a href="http://www.fastcgi.com">FastCGI</a> (and <a href="http://raa.ruby-lang.org/list.rhtml?name=fcgi">Ruby bindings</a>), if you need better performance
|
||||
|
@ -22,7 +22,7 @@
|
||||
#++
|
||||
|
||||
class Dispatcher
|
||||
DEFAULT_SESSION_OPTIONS = { "database_manager" => CGI::Session::PStore, "prefix" => "ruby_sess.", "session_path" => "/" }
|
||||
DEFAULT_SESSION_OPTIONS = { :database_manager => CGI::Session::PStore, :prefix => "ruby_sess.", :session_path => "/" }
|
||||
|
||||
def self.dispatch(cgi = CGI.new, session_options = DEFAULT_SESSION_OPTIONS)
|
||||
begin
|
||||
@ -38,12 +38,12 @@ def self.dispatch(cgi = CGI.new, session_options = DEFAULT_SESSION_OPTIONS)
|
||||
rescue Object => exception
|
||||
ActionController::Base.process_with_exception(request, response, exception).out
|
||||
ensure
|
||||
ActiveRecord::Base.reset_associations_loaded
|
||||
|
||||
if ActionController::Base.reload_dependencies
|
||||
Object.send(:remove_const, "AbstractApplicationController") if Object.const_defined?(:AbstractApplicationController)
|
||||
Object.send(:remove_const, controller_class_name(controller_name)) if Object.const_defined?(controller_class_name(controller_name))
|
||||
end
|
||||
ActiveRecord::Base.reset_associations_loaded
|
||||
ActiveRecord::Base.subclasses.each { |klass| klass.reset_inheritable_attributes }
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -50,7 +50,7 @@ def handle_index(req, res)
|
||||
if @server_options[:index_controller]
|
||||
res.set_redirect WEBrick::HTTPStatus::MovedPermanently, "/#{@server_options[:index_controller]}/"
|
||||
else
|
||||
res.set_redirect WEBrick::HTTPStatus::MovedPermanently, "/_doc/index.html"
|
||||
res.set_redirect WEBrick::HTTPStatus::MovedPermanently, "/_doc/"
|
||||
end
|
||||
|
||||
return true
|
||||
@ -72,9 +72,8 @@ def handle_file(req, res)
|
||||
end
|
||||
|
||||
def handle_mapped(req, res)
|
||||
parsed_ok, controller, action, id = DispatchServlet.parse_uri(req.request_uri.path)
|
||||
if parsed_ok
|
||||
query = "controller=#{controller}&action=#{action}&id=#{id}"
|
||||
if mappings = DispatchServlet.parse_uri(req.request_uri.path)
|
||||
query = mappings.collect { |pair| "#{pair.first}=#{pair.last}" }.join("&")
|
||||
query << "&#{req.request_uri.query}" if req.request_uri.query
|
||||
origin = req.request_uri.path + "?" + query
|
||||
req.request_uri.path = "/dispatch.rb"
|
||||
@ -124,17 +123,21 @@ def handle_dispatch(req, res, origin = nil)
|
||||
end
|
||||
|
||||
def self.parse_uri(path)
|
||||
component = /([-_a-zA-Z0-9]+)/
|
||||
component, id = /([-_a-zA-Z0-9]+)/, /([0-9]+)/
|
||||
|
||||
case path.sub(%r{^/(?:fcgi|mruby|cgi)/}, "/")
|
||||
when %r{^/#{component}/?$} then
|
||||
[true, $1, "index", nil]
|
||||
when %r{^/#{component}/#{component}/?$} then
|
||||
[true, $1, $2, nil]
|
||||
when %r{^/#{component}/#{component}/#{component}/?$} then
|
||||
[true, $1, $2, $3]
|
||||
{ :controller => $1, :action => "index" }
|
||||
when %r{^/#{component}/#{component}$} then
|
||||
{ :controller => $1, :action => $2 }
|
||||
when %r{^/#{component}/#{component}/$} then
|
||||
{ :module => $1, :controller => $2, :action => "index" }
|
||||
when %r{^/#{component}/#{component}/#{id}$} then
|
||||
{ :controller => $1, :action => $2, :id => $3 }
|
||||
when %r{^/#{component}/#{component}/#{component}/#{id}$} then
|
||||
{ :module => $1, :controller => $2, :action => $3, :id => $4 }
|
||||
else
|
||||
[false, nil, nil, nil]
|
||||
false
|
||||
end
|
||||
end
|
||||
end
|
||||
|
Loading…
Reference in New Issue
Block a user