mirror of
https://github.com/github/rails.git
synced 2026-04-26 03:00:59 -04:00
Merge branch 'master' of git://github.com/rails/rails
This commit is contained in:
@@ -98,18 +98,9 @@ module AbstractController
|
||||
_view_paths
|
||||
end
|
||||
|
||||
# Normalize options, by converting render "foo" to render :template => "foo"
|
||||
# and render "/foo" to render :file => "/foo".
|
||||
def _normalize_options(action=nil, options={})
|
||||
case action
|
||||
when Hash
|
||||
options, action = action, nil
|
||||
when String
|
||||
key = (action.index("/") == 0 ? :file : :template)
|
||||
options.merge!(key => action)
|
||||
end
|
||||
|
||||
options
|
||||
# The prefix used in render "foo" shortcuts.
|
||||
def _prefix
|
||||
controller_path
|
||||
end
|
||||
|
||||
# Return a string representation of a Rack-compatible response body.
|
||||
@@ -126,6 +117,28 @@ module AbstractController
|
||||
|
||||
private
|
||||
|
||||
# Normalize options, by converting render "foo" to render :template => "prefix/foo"
|
||||
# and render "/foo" to render :file => "/foo".
|
||||
def _normalize_options(action=nil, options={})
|
||||
case action
|
||||
when Hash
|
||||
options, action = action, nil
|
||||
when String, Symbol
|
||||
action = action.to_s
|
||||
case action.index("/")
|
||||
when NilClass
|
||||
options[:_prefix] = _prefix
|
||||
options[:_template_name] = action
|
||||
when 0
|
||||
options[:file] = action
|
||||
else
|
||||
options[:template] = action
|
||||
end
|
||||
end
|
||||
|
||||
options
|
||||
end
|
||||
|
||||
# Take in a set of options and determine the template to render
|
||||
#
|
||||
# ==== Options
|
||||
|
||||
@@ -81,28 +81,5 @@ module ActionController
|
||||
filter << block if block
|
||||
filter
|
||||
end
|
||||
|
||||
def _normalize_options(action=nil, options={}, &blk)
|
||||
case action
|
||||
when NilClass
|
||||
when Hash, String
|
||||
options = super
|
||||
when Symbol
|
||||
options.merge! :action => action
|
||||
else
|
||||
options.merge! :partial => action
|
||||
end
|
||||
|
||||
if options.key?(:action) && options[:action].to_s.index("/")
|
||||
options[:template] = options.delete(:action)
|
||||
end
|
||||
|
||||
if options[:status]
|
||||
options[:status] = Rack::Utils.status_code(options[:status])
|
||||
end
|
||||
|
||||
options[:update] = blk if block_given?
|
||||
options
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -25,18 +25,6 @@ module ActionController
|
||||
end
|
||||
|
||||
private
|
||||
def _prefix
|
||||
controller_path
|
||||
end
|
||||
|
||||
def _determine_template(options)
|
||||
if (options.keys & [:partial, :file, :template, :text, :inline]).empty?
|
||||
options[:_template_name] ||= options[:action]
|
||||
options[:_prefix] = _prefix
|
||||
end
|
||||
|
||||
super
|
||||
end
|
||||
|
||||
def _render_partial(options)
|
||||
options[:partial] = action_name if options[:partial] == true
|
||||
@@ -54,5 +42,29 @@ module ActionController
|
||||
self.content_type = content_type if content_type
|
||||
self.headers["Location"] = url_for(location) if location
|
||||
end
|
||||
|
||||
def _normalize_options(action=nil, options={}, &blk)
|
||||
case action
|
||||
when NilClass
|
||||
when Hash
|
||||
options = super(action.delete(:action), action)
|
||||
when String, Symbol
|
||||
options = super
|
||||
else
|
||||
options.merge! :partial => action
|
||||
end
|
||||
|
||||
if (options.keys & [:partial, :file, :template, :text, :inline]).empty?
|
||||
options[:_template_name] ||= options[:action]
|
||||
options[:_prefix] = _prefix
|
||||
end
|
||||
|
||||
if options[:status]
|
||||
options[:status] = Rack::Utils.status_code(options[:status])
|
||||
end
|
||||
|
||||
options[:update] = blk if block_given?
|
||||
options
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -181,7 +181,6 @@ module ActionView #:nodoc:
|
||||
extend ActiveSupport::Memoizable
|
||||
|
||||
attr_accessor :base_path, :assigns, :template_extension, :formats
|
||||
attr_accessor :controller
|
||||
attr_internal :captures
|
||||
|
||||
def reset_formats(formats)
|
||||
@@ -277,13 +276,13 @@ module ActionView #:nodoc:
|
||||
@config = nil
|
||||
@formats = formats
|
||||
@assigns = assigns_for_first_render.each { |key, value| instance_variable_set("@#{key}", value) }
|
||||
@controller = controller
|
||||
@_controller = controller
|
||||
@helpers = self.class.helpers || Module.new
|
||||
@_content_for = Hash.new {|h,k| h[k] = ActionView::SafeBuffer.new }
|
||||
self.view_paths = view_paths
|
||||
end
|
||||
|
||||
attr_internal :template
|
||||
attr_internal :controller, :template
|
||||
attr_reader :view_paths
|
||||
|
||||
def view_paths=(paths)
|
||||
@@ -298,12 +297,11 @@ module ActionView #:nodoc:
|
||||
|
||||
# Evaluates the local assigns and controller ivars, pushes them to the view.
|
||||
def _evaluate_assigns_and_ivars #:nodoc:
|
||||
if @controller
|
||||
variables = @controller.instance_variable_names
|
||||
variables -= @controller.protected_instance_variables if @controller.respond_to?(:protected_instance_variables)
|
||||
variables.each { |name| instance_variable_set(name, @controller.instance_variable_get(name)) }
|
||||
if controller
|
||||
variables = controller.instance_variable_names
|
||||
variables -= controller.protected_instance_variables if controller.respond_to?(:protected_instance_variables)
|
||||
variables.each { |name| instance_variable_set(name, controller.instance_variable_get(name)) }
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
@@ -634,8 +634,8 @@ module ActionView
|
||||
# Prefix with <tt>/dir/</tt> if lacking a leading +/+. Account for relative URL
|
||||
# roots. Rewrite the asset path for cache-busting asset ids. Include
|
||||
# asset host, if configured, with the correct request protocol.
|
||||
def compute_public_path(source, dir, ext = nil, include_host = true)
|
||||
has_request = @controller.respond_to?(:request)
|
||||
def compute_public_path(source, dir, ext = nil, include_host = true)
|
||||
has_request = controller.respond_to?(:request)
|
||||
|
||||
source_ext = File.extname(source)[1..-1]
|
||||
if ext && !is_uri?(source) && (source_ext.blank? || (ext != source_ext && File.exist?(File.join(config.assets_dir, dir, "#{source}.#{ext}"))))
|
||||
@@ -658,7 +658,7 @@ module ActionView
|
||||
host = compute_asset_host(source)
|
||||
|
||||
if has_request && !host.blank? && !is_uri?(host)
|
||||
host = "#{@controller.request.protocol}#{host}"
|
||||
host = "#{controller.request.protocol}#{host}"
|
||||
end
|
||||
|
||||
"#{host}#{source}"
|
||||
@@ -681,7 +681,7 @@ module ActionView
|
||||
if host.is_a?(Proc) || host.respond_to?(:call)
|
||||
case host.is_a?(Proc) ? host.arity : host.method(:call).arity
|
||||
when 2
|
||||
request = @controller.respond_to?(:request) && @controller.request
|
||||
request = controller.respond_to?(:request) && controller.request
|
||||
host.call(source, request)
|
||||
else
|
||||
host.call(source)
|
||||
|
||||
@@ -32,7 +32,7 @@ module ActionView
|
||||
# <i>Topics listed alphabetically</i>
|
||||
# <% end %>
|
||||
def cache(name = {}, options = nil, &block)
|
||||
@controller.fragment_for(output_buffer, name, options, &block)
|
||||
controller.fragment_for(output_buffer, name, options, &block)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -13,7 +13,7 @@ module ActionView
|
||||
|
||||
# Need to map default url options to controller one.
|
||||
def default_url_options(*args) #:nodoc:
|
||||
@controller.send(:default_url_options, *args)
|
||||
controller.send(:default_url_options, *args)
|
||||
end
|
||||
|
||||
# Returns the URL for the set of +options+ provided. This takes the
|
||||
@@ -89,10 +89,10 @@ module ActionView
|
||||
when Hash
|
||||
options = { :only_path => options[:host].nil? }.update(options.symbolize_keys)
|
||||
escape = options.key?(:escape) ? options.delete(:escape) : false
|
||||
@controller.send(:url_for, options)
|
||||
controller.send(:url_for, options)
|
||||
when :back
|
||||
escape = false
|
||||
@controller.request.env["HTTP_REFERER"] || 'javascript:history.back()'
|
||||
controller.request.env["HTTP_REFERER"] || 'javascript:history.back()'
|
||||
else
|
||||
escape = false
|
||||
polymorphic_path(options)
|
||||
@@ -546,10 +546,10 @@ module ActionView
|
||||
# # => false
|
||||
def current_page?(options)
|
||||
url_string = CGI.unescapeHTML(url_for(options))
|
||||
request = @controller.request
|
||||
# We ignore any extra parameters in the request_uri if the
|
||||
request = controller.request
|
||||
# We ignore any extra parameters in the request_uri if the
|
||||
# submitted url doesn't have any either. This lets the function
|
||||
# work with things like ?order=asc
|
||||
# work with things like ?order=asc
|
||||
if url_string.index("?")
|
||||
request_uri = request.request_uri
|
||||
else
|
||||
|
||||
@@ -6,9 +6,16 @@ module AbstractController
|
||||
class ControllerRenderer < AbstractController::Base
|
||||
include AbstractController::Rendering
|
||||
|
||||
def _prefix
|
||||
"renderer"
|
||||
end
|
||||
|
||||
self.view_paths = [ActionView::FixtureResolver.new(
|
||||
"default.erb" => "With Default",
|
||||
"template.erb" => "With Template",
|
||||
"renderer/string.erb" => "With String",
|
||||
"renderer/symbol.erb" => "With Symbol",
|
||||
"string/with_path.erb" => "With String With Path",
|
||||
"some/file.erb" => "With File",
|
||||
"template_name.erb" => "With Template Name"
|
||||
)]
|
||||
@@ -33,8 +40,16 @@ module AbstractController
|
||||
render
|
||||
end
|
||||
|
||||
def shortcut
|
||||
render "template"
|
||||
def string
|
||||
render "string"
|
||||
end
|
||||
|
||||
def string_with_path
|
||||
render "string/with_path"
|
||||
end
|
||||
|
||||
def symbol
|
||||
render :symbol
|
||||
end
|
||||
|
||||
def template_name
|
||||
@@ -77,9 +92,19 @@ module AbstractController
|
||||
assert_equal "With Default", @controller.response_body
|
||||
end
|
||||
|
||||
def test_render_template_through_shortcut
|
||||
@controller.process(:shortcut)
|
||||
assert_equal "With Template", @controller.response_body
|
||||
def test_render_string
|
||||
@controller.process(:string)
|
||||
assert_equal "With String", @controller.response_body
|
||||
end
|
||||
|
||||
def test_render_symbol
|
||||
@controller.process(:symbol)
|
||||
assert_equal "With Symbol", @controller.response_body
|
||||
end
|
||||
|
||||
def test_render_string_with_path
|
||||
@controller.process(:string_with_path)
|
||||
assert_equal "With String With Path", @controller.response_body
|
||||
end
|
||||
|
||||
def test_render_template_name
|
||||
|
||||
@@ -1236,7 +1236,7 @@ module ActiveRecord #:nodoc:
|
||||
end
|
||||
|
||||
def construct_finder_arel(options = {}, scope = nil)
|
||||
relation = unscoped.apply_finder_options(options)
|
||||
relation = options.is_a?(Hash) ? unscoped.apply_finder_options(options) : unscoped.merge(options)
|
||||
relation = scope.merge(relation) if scope
|
||||
relation
|
||||
end
|
||||
@@ -1450,7 +1450,8 @@ module ActiveRecord #:nodoc:
|
||||
end
|
||||
|
||||
def scoped_methods #:nodoc:
|
||||
Thread.current[:"#{self}_scoped_methods"] ||= self.default_scoping.dup
|
||||
key = :"#{self}_scoped_methods"
|
||||
Thread.current[key] = Thread.current[key].presence || self.default_scoping.dup
|
||||
end
|
||||
|
||||
def current_scoped_methods #:nodoc:
|
||||
|
||||
@@ -32,7 +32,7 @@ module ActiveRecord
|
||||
end
|
||||
|
||||
def respond_to?(method, include_private = false)
|
||||
return true if arel.respond_to?(method, include_private) || Array.method_defined?(method)
|
||||
return true if arel.respond_to?(method, include_private) || Array.method_defined?(method) || @klass.respond_to?(method, include_private)
|
||||
|
||||
if match = DynamicFinderMatch.match(method)
|
||||
return true if @klass.send(:all_attributes_exists?, match.attribute_names)
|
||||
@@ -301,6 +301,8 @@ module ActiveRecord
|
||||
def method_missing(method, *args, &block)
|
||||
if Array.method_defined?(method)
|
||||
to_a.send(method, *args, &block)
|
||||
elsif @klass.respond_to?(method)
|
||||
@klass.send(:with_scope, self) { @klass.send(method, *args, &block) }
|
||||
elsif arel.respond_to?(method)
|
||||
arel.send(method, *args, &block)
|
||||
elsif match = DynamicFinderMatch.match(method)
|
||||
|
||||
@@ -588,7 +588,7 @@ class HasAndBelongsToManyScopingTest< ActiveRecord::TestCase
|
||||
end
|
||||
|
||||
class DefaultScopingTest < ActiveRecord::TestCase
|
||||
fixtures :developers
|
||||
fixtures :developers, :posts
|
||||
|
||||
def test_default_scope
|
||||
expected = Developer.find(:all, :order => 'salary DESC').collect { |dev| dev.salary }
|
||||
@@ -657,6 +657,12 @@ class DefaultScopingTest < ActiveRecord::TestCase
|
||||
received = DeveloperOrderedBySalary.find(:all, :order => 'salary').collect { |dev| dev.salary }
|
||||
assert_equal expected, received
|
||||
end
|
||||
|
||||
def test_default_scope_using_relation
|
||||
posts = PostWithComment.scoped
|
||||
assert_equal 2, posts.count
|
||||
assert_equal posts(:thinking), posts.first
|
||||
end
|
||||
end
|
||||
|
||||
=begin
|
||||
|
||||
@@ -380,6 +380,15 @@ class NamedScopeTest < ActiveRecord::TestCase
|
||||
assert_deprecated('named_scope has been deprecated') { Topic.named_scope :deprecated_named_scope }
|
||||
end
|
||||
|
||||
def test_named_scopes_on_relations
|
||||
# Topic.replied
|
||||
approved_topics = Topic.scoped.approved.order('id DESC')
|
||||
assert_equal topics(:fourth), approved_topics.first
|
||||
|
||||
replied_approved_topics = approved_topics.replied
|
||||
assert_equal topics(:third), replied_approved_topics.first
|
||||
end
|
||||
|
||||
def test_index_on_named_scope
|
||||
approved = Topic.approved.order('id ASC')
|
||||
assert_equal topics(:second), approved[0]
|
||||
|
||||
@@ -164,6 +164,11 @@ class RelationTest < ActiveRecord::TestCase
|
||||
end
|
||||
end
|
||||
|
||||
def test_respond_to_class_methods_and_named_scopes
|
||||
assert DeveloperOrderedBySalary.scoped.respond_to?(:all_ordered_by_name)
|
||||
assert Topic.scoped.respond_to?(:by_lifo)
|
||||
end
|
||||
|
||||
def test_find_with_readonly_option
|
||||
Developer.scoped.each { |d| assert !d.readonly? }
|
||||
Developer.scoped.readonly.each { |d| assert d.readonly? }
|
||||
|
||||
@@ -100,3 +100,8 @@ end
|
||||
class SubStiPost < StiPost
|
||||
self.table_name = Post.table_name
|
||||
end
|
||||
|
||||
class PostWithComment < ActiveRecord::Base
|
||||
self.table_name = 'posts'
|
||||
default_scope where("posts.comments_count > 0").order("posts.comments_count ASC")
|
||||
end
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# This file is used by Rack-based servers to start the application.
|
||||
|
||||
require ::File.expand_path('../config/environment', __FILE__)
|
||||
run <%= app_const %>.instance
|
||||
run <%= app_const %>
|
||||
|
||||
@@ -59,4 +59,4 @@ production:
|
||||
#account: my_account
|
||||
#app_user: my_app_user
|
||||
#application: my_application
|
||||
#workstation: my_workstation
|
||||
#workstation: my_workstation
|
||||
|
||||
@@ -16,4 +16,4 @@
|
||||
|
||||
# Don't care if the mailer can't send
|
||||
config.action_mailer.raise_delivery_errors = false
|
||||
end
|
||||
end
|
||||
|
||||
@@ -30,4 +30,4 @@
|
||||
|
||||
# Enable threaded mode
|
||||
# config.threadsafe!
|
||||
end
|
||||
end
|
||||
|
||||
@@ -26,4 +26,4 @@
|
||||
# This is necessary if your schema can't be completely dumped by the schema dumper,
|
||||
# like if you have constraints or database-specific column types
|
||||
# config.active_record.schema_format = :sql
|
||||
end
|
||||
end
|
||||
|
||||
@@ -4,4 +4,4 @@
|
||||
# Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ }
|
||||
|
||||
# You can also remove all the silencers if you're trying to debug a problem that might stem from framework code.
|
||||
# Rails.backtrace_cleaner.remove_silencers!
|
||||
# Rails.backtrace_cleaner.remove_silencers!
|
||||
|
||||
@@ -2,4 +2,4 @@
|
||||
# See http://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points.
|
||||
|
||||
en:
|
||||
hello: "Hello world"
|
||||
hello: "Hello world"
|
||||
|
||||
@@ -2,6 +2,6 @@
|
||||
# The data can then be loaded with the rake db:seed (or created alongside the db with db:setup).
|
||||
#
|
||||
# Examples:
|
||||
#
|
||||
#
|
||||
# cities = City.create([{ :name => 'Chicago' }, { :name => 'Copenhagen' }])
|
||||
# Mayor.create(:name => 'Daley', :city => cities.first)
|
||||
|
||||
@@ -2,4 +2,4 @@ require File.expand_path('../../config/boot', __FILE__)
|
||||
require 'rails/commands/console'
|
||||
require File.expand_path('../../config/application', __FILE__)
|
||||
|
||||
Rails::Console.start(<%= app_const %>.instance)
|
||||
Rails::Console.start(<%= app_const %>)
|
||||
|
||||
@@ -2,4 +2,4 @@ require File.expand_path('../../config/boot', __FILE__)
|
||||
require 'rails/commands/dbconsole'
|
||||
require File.expand_path('../../config/application', __FILE__)
|
||||
|
||||
Rails::DBConsole.start(<%= app_const %>.instance)
|
||||
Rails::DBConsole.start(<%= app_const %>)
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
# Allow the metal piece to run in isolation
|
||||
require(File.dirname(__FILE__) + "/../../config/environment") unless defined?(Rails)
|
||||
require File.expand_path('../../../config/environment', __FILE__)
|
||||
|
||||
class <%= class_name %>
|
||||
def self.call(env)
|
||||
if env["PATH_INFO"] =~ /^\/<%= file_name %>/
|
||||
[200, {"Content-Type" => "text/html"}, ["Hello, World!"]]
|
||||
else
|
||||
[404, {"Content-Type" => "text/html"}, ["Not Found"]]
|
||||
[404, {"Content-Type" => "text/html", "X-Cascade" => "pass"}, ["Not Found"]]
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1,22 +1,10 @@
|
||||
require 'rake'
|
||||
require 'rake/testtask'
|
||||
require 'rake/rdoctask'
|
||||
|
||||
desc 'Default: run unit tests.'
|
||||
task :default => :test
|
||||
|
||||
desc 'Test the <%= file_name %> plugin.'
|
||||
Rake::TestTask.new(:test) do |t|
|
||||
t.libs << 'lib'
|
||||
t.libs << 'test'
|
||||
t.pattern = 'test/**/*_test.rb'
|
||||
end
|
||||
|
||||
desc 'Generate documentation for the <%= file_name %> plugin.'
|
||||
Rake::RDocTask.new(:rdoc) do |rdoc|
|
||||
rdoc.rdoc_dir = 'rdoc'
|
||||
rdoc.title = '<%= class_name %>'
|
||||
rdoc.options << '--line-numbers' << '--inline-source'
|
||||
rdoc.rdoc_files.include('README')
|
||||
rdoc.rdoc_files.include('lib/**/*.rb')
|
||||
end
|
||||
|
||||
@@ -59,4 +59,3 @@ div.field, div.actions {
|
||||
font-size: 12px;
|
||||
list-style: square;
|
||||
}
|
||||
|
||||
|
||||
@@ -8,7 +8,13 @@ module Rails
|
||||
class << self
|
||||
attr_writer :config
|
||||
alias configure class_eval
|
||||
delegate :initialize!, :load_tasks, :load_generators, :root, :to => :instance
|
||||
delegate :call,
|
||||
:initialize!,
|
||||
:load_generators,
|
||||
:load_tasks,
|
||||
:middleware,
|
||||
:root,
|
||||
:to => :instance
|
||||
|
||||
private :new
|
||||
def instance
|
||||
|
||||
@@ -76,7 +76,7 @@ module ApplicationTests
|
||||
end
|
||||
|
||||
def middleware
|
||||
AppTemplate::Application.instance.middleware.active.map(&:klass).map(&:name)
|
||||
AppTemplate::Application.middleware.active.map(&:klass).map(&:name)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -176,5 +176,33 @@ module ApplicationTests
|
||||
get '/foo'
|
||||
assert_equal 'baz', last_response.body
|
||||
end
|
||||
|
||||
test 'resource routing with irrigular inflection' do
|
||||
app_file 'config/initializers/inflection.rb', <<-RUBY
|
||||
ActiveSupport::Inflector.inflections do |inflect|
|
||||
inflect.irregular 'yazi', 'yazilar'
|
||||
end
|
||||
RUBY
|
||||
|
||||
app_file 'config/routes.rb', <<-RUBY
|
||||
AppTemplate::Application.routes.draw do |map|
|
||||
resources :yazilar
|
||||
end
|
||||
RUBY
|
||||
|
||||
controller 'yazilar', <<-RUBY
|
||||
class YazilarController < ActionController::Base
|
||||
def index
|
||||
render :text => 'yazilar#index'
|
||||
end
|
||||
end
|
||||
RUBY
|
||||
|
||||
get '/yazilars'
|
||||
assert_equal 404, last_response.status
|
||||
|
||||
get '/yazilar'
|
||||
assert_equal 200, last_response.status
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -17,11 +17,11 @@ class PluginGeneratorTest < Rails::Generators::TestCase
|
||||
vendor/plugins/plugin_fu/uninstall.rb
|
||||
vendor/plugins/plugin_fu/lib
|
||||
vendor/plugins/plugin_fu/lib/plugin_fu.rb
|
||||
vendor/plugins/plugin_fu/Rakefile
|
||||
).each{ |path| assert_file path }
|
||||
|
||||
%w(
|
||||
vendor/plugins/plugin_fu/README
|
||||
vendor/plugins/plugin_fu/Rakefile
|
||||
).each{ |path| assert_file path, /PluginFu/ }
|
||||
|
||||
%w(
|
||||
|
||||
Reference in New Issue
Block a user