From 2ea922bcec333b6484a295b4fee1f4fa75c5704d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tarmo=20T=C3=A4nav?= Date: Wed, 10 Jun 2009 16:24:32 +0300 Subject: Don't increment and then decrement the same counter when re-assigning a belongs_to association [#2786 state:committed] Signed-off-by: Santiago Pastorino --- activerecord/lib/active_record/associations/belongs_to_association.rb | 2 +- activerecord/test/cases/associations/belongs_to_associations_test.rb | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/activerecord/lib/active_record/associations/belongs_to_association.rb b/activerecord/lib/active_record/associations/belongs_to_association.rb index c2a6495db5..4558872a2b 100644 --- a/activerecord/lib/active_record/associations/belongs_to_association.rb +++ b/activerecord/lib/active_record/associations/belongs_to_association.rb @@ -22,7 +22,7 @@ module ActiveRecord else raise_on_type_mismatch(record) - if counter_cache_name && !@owner.new_record? + if counter_cache_name && !@owner.new_record? && record.id != @owner[@reflection.primary_key_name] @reflection.klass.increment_counter(counter_cache_name, record.id) @reflection.klass.decrement_counter(counter_cache_name, @owner[@reflection.primary_key_name]) if @owner[@reflection.primary_key_name] end diff --git a/activerecord/test/cases/associations/belongs_to_associations_test.rb b/activerecord/test/cases/associations/belongs_to_associations_test.rb index 4d5769d173..046433820d 100644 --- a/activerecord/test/cases/associations/belongs_to_associations_test.rb +++ b/activerecord/test/cases/associations/belongs_to_associations_test.rb @@ -215,6 +215,10 @@ class BelongsToAssociationsTest < ActiveRecord::TestCase r1.topic = Topic.find(t2.id) + assert_no_queries do + r1.topic = t2 + end + assert r1.save assert_equal 0, Topic.find(t1.id).replies.size assert_equal 1, Topic.find(t2.id).replies.size -- cgit v1.2.3 From 55028a7326b833d51d0ab060828cf5f6983c93d8 Mon Sep 17 00:00:00 2001 From: Santiago Pastorino Date: Thu, 29 Jul 2010 23:44:31 -0300 Subject: Bump up nokogiri to 1.4.3.1 --- Gemfile | 4 ++-- railties/guides/source/initialization.textile | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Gemfile b/Gemfile index 3a6064db96..c8dbcc0507 100644 --- a/Gemfile +++ b/Gemfile @@ -27,7 +27,7 @@ end platforms :ruby do gem 'json' gem 'yajl-ruby' - gem "nokogiri", ">= 1.4.2" + gem "nokogiri", ">= 1.4.3.1" # AR gem "sqlite3-ruby", "~> 1.3.1", :require => 'sqlite3' @@ -50,7 +50,7 @@ platforms :jruby do end env 'CI' do - gem "nokogiri", ">= 1.4.2" + gem "nokogiri", ">= 1.4.3.1" platforms :ruby_18 do # fcgi gem doesn't compile on 1.9 diff --git a/railties/guides/source/initialization.textile b/railties/guides/source/initialization.textile index 28afdb3bd0..19bc33c454 100644 --- a/railties/guides/source/initialization.textile +++ b/railties/guides/source/initialization.textile @@ -147,7 +147,7 @@ Here the only two gems we need are +rails+ and +sqlite3-ruby+, so it seems. This * mail-2.2.5.gem * memcache-client-1.8.5.gem * mime-types-1.16.gem -* nokogiri-1.4.2.gem +* nokogiri-1.4.3.1.gem * polyglot-0.3.1.gem * rack-1.2.1.gem * rack-mount-0.6.9.gem -- cgit v1.2.3 From e68e88e3ada6b500012f893156b03f548a2f87e3 Mon Sep 17 00:00:00 2001 From: Santiago Pastorino Date: Thu, 29 Jul 2010 23:46:25 -0300 Subject: This version is going to be outdated when new nokogiri versions are released --- railties/guides/source/initialization.textile | 2 +- railties/lib/rails/generators/rails/app/templates/Gemfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/railties/guides/source/initialization.textile b/railties/guides/source/initialization.textile index 19bc33c454..2f45aeaa8a 100644 --- a/railties/guides/source/initialization.textile +++ b/railties/guides/source/initialization.textile @@ -118,7 +118,7 @@ Now with Rails 3 we have a Gemfile which defines the basics our application need # Bundle the extra gems: # gem 'bj' - # gem 'nokogiri', '1.4.1' + # gem 'nokogiri' # gem 'sqlite3-ruby', :require => 'sqlite3' # gem 'aws-s3', :require => 'aws/s3' diff --git a/railties/lib/rails/generators/rails/app/templates/Gemfile b/railties/lib/rails/generators/rails/app/templates/Gemfile index a108968b97..1980684a94 100644 --- a/railties/lib/rails/generators/rails/app/templates/Gemfile +++ b/railties/lib/rails/generators/rails/app/templates/Gemfile @@ -28,7 +28,7 @@ gem '<%= gem_for_database %>'<% if require_for_database %>, :require => '<%= req # Bundle the extra gems: # gem 'bj' -# gem 'nokogiri', '1.4.1' +# gem 'nokogiri' # gem 'sqlite3-ruby', :require => 'sqlite3' # gem 'aws-s3', :require => 'aws/s3' -- cgit v1.2.3 From 03fc2f03cbc9b3354267e599f5fb6a42d58cd194 Mon Sep 17 00:00:00 2001 From: Santiago Pastorino Date: Thu, 29 Jul 2010 23:48:47 -0300 Subject: Bump up bundler version to rc.2 --- rails.gemspec | 2 +- railties/guides/source/contributing_to_rails.textile | 2 +- railties/guides/source/initialization.textile | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/rails.gemspec b/rails.gemspec index 00dde1934d..8c90584470 100644 --- a/rails.gemspec +++ b/rails.gemspec @@ -25,5 +25,5 @@ Gem::Specification.new do |s| s.add_dependency('activeresource', version) s.add_dependency('actionmailer', version) s.add_dependency('railties', version) - s.add_dependency('bundler', '>= 1.0.0.rc.1') + s.add_dependency('bundler', '>= 1.0.0.rc.2') end diff --git a/railties/guides/source/contributing_to_rails.textile b/railties/guides/source/contributing_to_rails.textile index 094a4ef1a9..fb81bab98d 100644 --- a/railties/guides/source/contributing_to_rails.textile +++ b/railties/guides/source/contributing_to_rails.textile @@ -69,7 +69,7 @@ All of the Rails tests must pass with any code you submit, otherwise you have no NOTE: Ensure you install bundler v1.0 -gem install -v=1.0.0.rc.1 bundler +gem install -v=1.0.0.rc.2 bundler bundle install --without db diff --git a/railties/guides/source/initialization.textile b/railties/guides/source/initialization.textile index 2f45aeaa8a..f80c00b280 100644 --- a/railties/guides/source/initialization.textile +++ b/railties/guides/source/initialization.textile @@ -141,7 +141,7 @@ Here the only two gems we need are +rails+ and +sqlite3-ruby+, so it seems. This * activesupport-3.0.0.beta4.gem * arel-0.4.0.gem * builder-2.1.2.gem -* bundler-1.0.0.beta.5.gem +* bundler-1.0.0.rc.2.gem * erubis-2.6.6.gem * i18n-0.4.1.gem * mail-2.2.5.gem -- cgit v1.2.3 From d277b823d0d455c2d7a18cc0eb334890a32ad30e Mon Sep 17 00:00:00 2001 From: Carl Lerche Date: Thu, 29 Jul 2010 22:53:21 -0700 Subject: Add another missing require in 'active_support/inflector/inflections' --- activesupport/lib/active_support/core_ext/string/inflections.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/activesupport/lib/active_support/core_ext/string/inflections.rb b/activesupport/lib/active_support/core_ext/string/inflections.rb index f33e4959f9..32913a06ad 100644 --- a/activesupport/lib/active_support/core_ext/string/inflections.rb +++ b/activesupport/lib/active_support/core_ext/string/inflections.rb @@ -1,4 +1,5 @@ require 'active_support/inflector/methods' +require 'active_support/inflector/inflections' # String inflections define new methods on the String class to transform names for different purposes. # For instance, you can figure out the name of a database from the name of a class. # -- cgit v1.2.3 From b823e50a54156f688dd0892e7a8671b730814bc6 Mon Sep 17 00:00:00 2001 From: Steve Agalloco Date: Thu, 29 Jul 2010 22:38:45 -0400 Subject: fix for rails app generator when using --pretend option [#5245 state:committed] Signed-off-by: Santiago Pastorino --- railties/lib/rails/generators/rails/app/app_generator.rb | 2 +- railties/test/generators/app_generator_test.rb | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/railties/lib/rails/generators/rails/app/app_generator.rb b/railties/lib/rails/generators/rails/app/app_generator.rb index 1324cc1f67..96c49a81bb 100644 --- a/railties/lib/rails/generators/rails/app/app_generator.rb +++ b/railties/lib/rails/generators/rails/app/app_generator.rb @@ -216,7 +216,7 @@ module Rails empty_directory '.' set_default_accessors! - FileUtils.cd(destination_root) + FileUtils.cd(destination_root) unless options[:pretend] end def create_root_files diff --git a/railties/test/generators/app_generator_test.rb b/railties/test/generators/app_generator_test.rb index 67a878e926..1e0b3bf4c7 100644 --- a/railties/test/generators/app_generator_test.rb +++ b/railties/test/generators/app_generator_test.rb @@ -58,6 +58,12 @@ class AppGeneratorTest < Rails::Generators::TestCase DEFAULT_APP_FILES.each{ |path| assert_file path } end + def test_application_generate_pretend + run_generator ["testapp", "--pretend"] + + DEFAULT_APP_FILES.each{ |path| assert_no_file path } + end + def test_application_controller_and_layout_files run_generator assert_file "app/views/layouts/application.html.erb", /stylesheet_link_tag :all/ -- cgit v1.2.3 From 95e9ced5815782980230221d6a0b33fde2d74c98 Mon Sep 17 00:00:00 2001 From: Santiago Pastorino Date: Fri, 30 Jul 2010 11:27:25 -0300 Subject: Make options an attr_reader --- activesupport/lib/active_support/cache.rb | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/activesupport/lib/active_support/cache.rb b/activesupport/lib/active_support/cache.rb index 8e90de110a..30195bdea5 100644 --- a/activesupport/lib/active_support/cache.rb +++ b/activesupport/lib/active_support/cache.rb @@ -138,7 +138,7 @@ module ActiveSupport cattr_accessor :logger, :instance_writer => true - attr_reader :silence + attr_reader :silence, :options alias :silence? :silence # Create a new cache. The options will be passed to any write method calls except @@ -147,11 +147,6 @@ module ActiveSupport @options = options ? options.dup : {} end - # Get the default options set when the cache was created. - def options - @options ||= {} - end - # Silence the logger. def silence! @silence = true -- cgit v1.2.3 From 5132081975810afade4d783e68731b06d7f37665 Mon Sep 17 00:00:00 2001 From: Santiago Pastorino Date: Fri, 30 Jul 2010 16:05:51 -0300 Subject: AS gem doesn't depend on nokogiri so shows a nicer error if users haven't installed --- activesupport/lib/active_support/xml_mini/nokogiri.rb | 7 ++++++- activesupport/lib/active_support/xml_mini/nokogirisax.rb | 9 +++++++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/activesupport/lib/active_support/xml_mini/nokogiri.rb b/activesupport/lib/active_support/xml_mini/nokogiri.rb index eb61a7fc22..e03a744257 100644 --- a/activesupport/lib/active_support/xml_mini/nokogiri.rb +++ b/activesupport/lib/active_support/xml_mini/nokogiri.rb @@ -1,4 +1,9 @@ -require 'nokogiri' +begin + require 'nokogiri' +rescue LoadError => e + $stderr.puts "You don't have nokogiri installed in your application. Please add it to your Gemfile and run bundle install" + raise e +end require 'active_support/core_ext/object/blank' # = XmlMini Nokogiri implementation diff --git a/activesupport/lib/active_support/xml_mini/nokogirisax.rb b/activesupport/lib/active_support/xml_mini/nokogirisax.rb index 8af7b5e565..38c8685390 100644 --- a/activesupport/lib/active_support/xml_mini/nokogirisax.rb +++ b/activesupport/lib/active_support/xml_mini/nokogirisax.rb @@ -1,4 +1,9 @@ -require 'nokogiri' +begin + require 'nokogiri' +rescue LoadError => e + $stderr.puts "You don't have nokogiri installed in your application. Please add it to your Gemfile and run bundle install" + raise e +end require 'active_support/core_ext/object/blank' # = XmlMini Nokogiri implementation using a SAX-based parser @@ -80,4 +85,4 @@ module ActiveSupport end end end -end \ No newline at end of file +end -- cgit v1.2.3 From 05e0fa9cfb9afd5ce4e9299c81f824d16373fc03 Mon Sep 17 00:00:00 2001 From: Xavier Noria Date: Fri, 30 Jul 2010 20:11:59 +0200 Subject: the main page of the API generated by the doc:rails task is README --- railties/lib/rails/tasks/documentation.rake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/railties/lib/rails/tasks/documentation.rake b/railties/lib/rails/tasks/documentation.rake index 843d2b4e82..c1b1a41d48 100644 --- a/railties/lib/rails/tasks/documentation.rake +++ b/railties/lib/rails/tasks/documentation.rake @@ -55,7 +55,7 @@ namespace :doc do rdoc.template = "#{ENV['template']}.rb" if ENV['template'] rdoc.title = "Rails Framework Documentation" rdoc.options << '--line-numbers' << '--inline-source' - rdoc.rdoc_files.include('README.rdoc') + rdoc.rdoc_files.include('README') gem_path('actionmailer') do |actionmailer| %w(README.rdoc CHANGELOG MIT-LICENSE lib/action_mailer/base.rb).each do |file| -- cgit v1.2.3 From 87a28e34aef3f68de8e344aadc47a516e28c0b09 Mon Sep 17 00:00:00 2001 From: Xavier Noria Date: Fri, 30 Jul 2010 21:50:38 +0200 Subject: if there's a Gemfile and doc:guides can't load RedCloth, print instructions for bundler --- railties/guides/rails_guides.rb | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/railties/guides/rails_guides.rb b/railties/guides/rails_guides.rb index e6f0b694a6..dfbb06cc76 100644 --- a/railties/guides/rails_guides.rb +++ b/railties/guides/rails_guides.rb @@ -1,6 +1,13 @@ pwd = File.dirname(__FILE__) $:.unshift pwd +# This is a predicate useful for the doc:guides task of applications. +def bundler? + # Note that rake sets the cwd to the one that contains the Rakefile + # being executed. + File.exists?('Gemfile') +end + # Loading Action Pack requires rack and erubis. require 'rubygems' @@ -20,7 +27,19 @@ begin gem 'RedCloth', '>= 4.1.1' require 'redcloth' rescue Gem::LoadError - $stderr.puts %(Generating Guides requires RedCloth 4.1.1+) + $stderr.puts('Generating guides requires RedCloth 4.1.1+.') + $stderr.puts(<= 4.1.1' + +to the Gemfile, run + + bundle install + +and try again. +ERROR + exit 1 end -- cgit v1.2.3 From d1c53a9ad273f31618adcfbcabb39fd74bb2b91f Mon Sep 17 00:00:00 2001 From: Aaron Patterson Date: Fri, 30 Jul 2010 13:38:09 -0700 Subject: reducing function calls and using faster methods for testing --- activerecord/lib/active_record/relation.rb | 14 +++++++------- activerecord/lib/active_record/relation/query_methods.rb | 12 +++--------- 2 files changed, 10 insertions(+), 16 deletions(-) diff --git a/activerecord/lib/active_record/relation.rb b/activerecord/lib/active_record/relation.rb index a8cea44c78..7962f52738 100644 --- a/activerecord/lib/active_record/relation.rb +++ b/activerecord/lib/active_record/relation.rb @@ -99,7 +99,7 @@ module ActiveRecord if block_given? to_a.many? { |*block_args| yield(*block_args) } else - @limit_value.present? ? to_a.many? : size > 1 + @limit_value ? to_a.many? : size > 1 end end @@ -316,12 +316,12 @@ module ActiveRecord def scope_for_create @scope_for_create ||= begin - @create_with_value || @where_values.inject({}) do |hash, where| - if where.is_a?(Arel::Predicates::Equality) - hash[where.operand1.name] = where.operand2.respond_to?(:value) ? where.operand2.value : where.operand2 - end - hash - end + @create_with_value || Hash[ + @where_values.grep(Arel::Predicates::Equality).map { |where| + [where.operand1.name, + where.operand2.respond_to?(:value) ? + where.operand2.value : where.operand2] + }] end end diff --git a/activerecord/lib/active_record/relation/query_methods.rb b/activerecord/lib/active_record/relation/query_methods.rb index 716e7275a5..4342dde5c8 100644 --- a/activerecord/lib/active_record/relation/query_methods.rb +++ b/activerecord/lib/active_record/relation/query_methods.rb @@ -129,7 +129,7 @@ module ActiveRecord def build_arel arel = table - arel = build_joins(arel, @joins_values) if @joins_values.present? + arel = build_joins(arel, @joins_values) unless @joins_values.empty? @where_values.uniq.each do |where| next if where.blank? @@ -145,7 +145,7 @@ module ActiveRecord arel = arel.having(*@having_values.uniq.select{|h| h.present?}) if @having_values.present? - arel = arel.take(@limit_value) if @limit_value.present? + arel = arel.take(@limit_value) if @limit_value arel = arel.skip(@offset_value) if @offset_value.present? arel = arel.group(*@group_values.uniq.select{|g| g.present?}) if @group_values.present? @@ -155,13 +155,7 @@ module ActiveRecord arel = build_select(arel, @select_values.uniq) arel = arel.from(@from_value) if @from_value.present? - - case @lock_value - when TrueClass - arel = arel.lock - when String - arel = arel.lock(@lock_value) - end if @lock_value.present? + arel = arel.lock(@lock_value) if @lock_value arel end -- cgit v1.2.3 From ecfb252e7a99bac6569f744064ef7f1ee1b31556 Mon Sep 17 00:00:00 2001 From: Aaron Patterson Date: Fri, 30 Jul 2010 14:05:26 -0700 Subject: fewer method calls, using faster methods when possible --- activerecord/lib/active_record/relation/query_methods.rb | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/activerecord/lib/active_record/relation/query_methods.rb b/activerecord/lib/active_record/relation/query_methods.rb index 4342dde5c8..b941231a65 100644 --- a/activerecord/lib/active_record/relation/query_methods.rb +++ b/activerecord/lib/active_record/relation/query_methods.rb @@ -143,18 +143,18 @@ module ActiveRecord end end - arel = arel.having(*@having_values.uniq.select{|h| h.present?}) if @having_values.present? + arel = arel.having(*@having_values.uniq.select{|h| h.present?}) unless @having_values.empty? arel = arel.take(@limit_value) if @limit_value - arel = arel.skip(@offset_value) if @offset_value.present? + arel = arel.skip(@offset_value) if @offset_value - arel = arel.group(*@group_values.uniq.select{|g| g.present?}) if @group_values.present? + arel = arel.group(*@group_values.uniq.select{|g| g.present?}) unless @group_values.empty? - arel = arel.order(*@order_values.uniq.select{|o| o.present?}) if @order_values.present? + arel = arel.order(*@order_values.uniq.select{|o| o.present?}) unless @order_values.empty? arel = build_select(arel, @select_values.uniq) - arel = arel.from(@from_value) if @from_value.present? + arel = arel.from(@from_value) if @from_value arel = arel.lock(@lock_value) if @lock_value arel -- cgit v1.2.3 From 834e304b223723d63596034ef338d9af6655d35b Mon Sep 17 00:00:00 2001 From: Aaron Patterson Date: Fri, 30 Jul 2010 14:12:01 -0700 Subject: reverting where() functionality, adding a test --- activerecord/lib/active_record/relation/query_methods.rb | 8 ++++---- activerecord/test/cases/relations_test.rb | 5 +++++ 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/activerecord/lib/active_record/relation/query_methods.rb b/activerecord/lib/active_record/relation/query_methods.rb index b941231a65..a92d180442 100644 --- a/activerecord/lib/active_record/relation/query_methods.rb +++ b/activerecord/lib/active_record/relation/query_methods.rb @@ -47,8 +47,8 @@ module ActiveRecord clone.tap {|r| r.joins_values += args if args.present? } end - def where(opts, other = nil) - value = build_where(opts, other) + def where(opts, *rest) + value = build_where(opts, rest) value ? clone.tap {|r| r.where_values += Array.wrap(value) } : clone end @@ -160,10 +160,10 @@ module ActiveRecord arel end - def build_where(opts, other = nil) + def build_where(opts, other = []) case opts when String, Array - @klass.send(:sanitize_sql, other ? [opts, other] : opts) + @klass.send(:sanitize_sql, other.empty? ? opts : ([opts] + other)) when Hash attributes = @klass.send(:expand_hash_conditions_for_aggregates, opts) PredicateBuilder.new(table.engine).build_from_hash(attributes, table) diff --git a/activerecord/test/cases/relations_test.rb b/activerecord/test/cases/relations_test.rb index cb252d56fe..c9313fe7b6 100644 --- a/activerecord/test/cases/relations_test.rb +++ b/activerecord/test/cases/relations_test.rb @@ -22,6 +22,11 @@ class RelationTest < ActiveRecord::TestCase assert_equal 5, Post.where(:id => post_authors).size end + def test_multivalue_where + posts = Post.where('author_id = ? AND id = ?', 1, 1) + assert_equal 1, posts.to_a.size + end + def test_scoped topics = Topic.scoped assert_kind_of ActiveRecord::Relation, topics -- cgit v1.2.3 From d3819daaac0d2f730f2b34af31700c914e697375 Mon Sep 17 00:00:00 2001 From: Xavier Noria Date: Sat, 31 Jul 2010 11:51:17 +0200 Subject: README.rdoc is your first impression, make sure it is clean * Removes spurious markup from code blocks * Integrates code blocks into ordinary paragraph flow * Change link to the Rails Tutorial so that it points directly to the book * Use proper RDoc markup for links --- README.rdoc | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/README.rdoc b/README.rdoc index 6198000279..41ba12fa42 100644 --- a/README.rdoc +++ b/README.rdoc @@ -29,29 +29,38 @@ link:files/vendor/rails/actionpack/README.html. == Getting Started 1. Install Rails at the command prompt if you haven't yet: - gem install rails + + gem install rails 2. At the command prompt, create a new Rails application: - rails new myapp (where myapp is the application name) -3. Change directory to myapp and start the web server: - cd myapp; rails server (run with --help for options) + rails new myapp + + where "myapp" is the application name. + +3. Change directory to +myapp+ and start the web server: + + cd myapp; rails server + + Run with --help for options. 4. Go to http://localhost:3000/ and you'll see: - "Welcome aboard: You're riding Ruby on Rails!" + + "Welcome aboard: You're riding Ruby on Rails!" 5. Follow the guidelines to start developing your application. You can find the following resources handy: -* The README file created within your application -* The Getting Started Guide: http://guides.rubyonrails.org/getting_started.html -* Ruby on Rails Tutorial Book: http://www.railstutorial.org/ +* The README file created within your application. +* The {Getting Started Guide}[http://guides.rubyonrails.org/getting_started.html]. +* The {Ruby on Rails Tutorial Book}[http://railstutorial.org/book]. == Contributing -Check out the contributing guide at http://edgeguides.rubyonrails.org/contributing_to_rails.html - +We encourage you to contribute to Ruby on Raills! Please check out the {Contributing to Rails +guide}[http://edgeguides.rubyonrails.org/contributing_to_rails.html] for guidelines about how +to proceed. {Join us}[http://contributors.rubyonrails.org]! == License -- cgit v1.2.3