<p>This pull request updates the site to use rails 4. All tests pass, and all deprecation warnings reported by the tests are fixed, but it does currently rely on patched versions of two gems (oauth-plugin and i18n-js).</p>
<p>There is a test site at <a href="http://rails4.apis.dev.openstreetmap.org/">http://rails4.apis.dev.openstreetmap.org/</a> and this could do with some testing before we think about merging it.</p>
<hr>
<h4>You can merge this Pull Request by running</h4>
<pre> git pull https://github.com/tomhughes/openstreetmap-website rails4</pre>
<p>Or view, comment on, or merge it at:</p>
<p> <a href='https://github.com/openstreetmap/openstreetmap-website/pull/432'>https://github.com/openstreetmap/openstreetmap-website/pull/432</a></p>
<h4>Commit Summary</h4>
<ul>
<li>Update to rails 4.0.0</li>
<li>Remove multiline regular expression anchors from validations</li>
<li>Replace attr_accessible with strong parameters</li>
<li>Eliminate deprecated scope and association arguments</li>
<li>Monkey patch PostgreSQLAdapter to make enums work</li>
<li>Replace deprecated `scoped` method with `all`</li>
<li>Rails now defaults to using PATCH for updates</li>
<li>IntegrationTest is now in ActionDispatch not ActionController</li>
<li>Replace deprecated finder methods</li>
<li>RoutingError is now UrlGenerationError</li>
<li>Remove format specifier from RSS feed route tests</li>
<li>Remove deprecated assert_blank and assert_present from tests</li>
<li>Detect test environment correctly</li>
<li>Set hostname for signed requests correctly</li>
<li>Always allow %{attribute} in model validation error messages</li>
<li>Fix rails 4 compatibility issues in migrations</li>
<li>Avoid singleton serialisation errors</li>
</ul>
<h4>File Changes</h4>
<ul>
<li>
<strong>M</strong>
<a href="https://github.com/openstreetmap/openstreetmap-website/pull/432/files#diff-0">Gemfile</a>
(48)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/openstreetmap/openstreetmap-website/pull/432/files#diff-1">Gemfile.lock</a>
(187)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/openstreetmap/openstreetmap-website/pull/432/files#diff-2">app/assets/javascripts/leaflet.extend.js.erb</a>
(2)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/openstreetmap/openstreetmap-website/pull/432/files#diff-3">app/controllers/api_controller.rb</a>
(4)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/openstreetmap/openstreetmap-website/pull/432/files#diff-4">app/controllers/browse_controller.rb</a>
(4)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/openstreetmap/openstreetmap-website/pull/432/files#diff-5">app/controllers/changeset_controller.rb</a>
(4)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/openstreetmap/openstreetmap-website/pull/432/files#diff-6">app/controllers/diary_entry_controller.rb</a>
(22)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/openstreetmap/openstreetmap-website/pull/432/files#diff-7">app/controllers/message_controller.rb</a>
(8)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/openstreetmap/openstreetmap-website/pull/432/files#diff-8">app/controllers/notes_controller.rb</a>
(10)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/openstreetmap/openstreetmap-website/pull/432/files#diff-9">app/controllers/oauth_clients_controller.rb</a>
(8)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/openstreetmap/openstreetmap-website/pull/432/files#diff-10">app/controllers/trace_controller.rb</a>
(6)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/openstreetmap/openstreetmap-website/pull/432/files#diff-11">app/controllers/user_blocks_controller.rb</a>
(8)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/openstreetmap/openstreetmap-website/pull/432/files#diff-12">app/controllers/user_controller.rb</a>
(15)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/openstreetmap/openstreetmap-website/pull/432/files#diff-13">app/controllers/user_roles_controller.rb</a>
(4)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/openstreetmap/openstreetmap-website/pull/432/files#diff-14">app/models/access_token.rb</a>
(2)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/openstreetmap/openstreetmap-website/pull/432/files#diff-15">app/models/client_application.rb</a>
(10)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/openstreetmap/openstreetmap-website/pull/432/files#diff-16">app/models/diary_comment.rb</a>
(2)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/openstreetmap/openstreetmap-website/pull/432/files#diff-17">app/models/diary_entry.rb</a>
(18)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/openstreetmap/openstreetmap-website/pull/432/files#diff-18">app/models/message.rb</a>
(6)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/openstreetmap/openstreetmap-website/pull/432/files#diff-19">app/models/node.rb</a>
(6)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/openstreetmap/openstreetmap-website/pull/432/files#diff-20">app/models/note.rb</a>
(7)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/openstreetmap/openstreetmap-website/pull/432/files#diff-21">app/models/oauth_nonce.rb</a>
(2)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/openstreetmap/openstreetmap-website/pull/432/files#diff-22">app/models/oauth_token.rb</a>
(6)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/openstreetmap/openstreetmap-website/pull/432/files#diff-23">app/models/old_relation.rb</a>
(2)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/openstreetmap/openstreetmap-website/pull/432/files#diff-24">app/models/relation.rb</a>
(14)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/openstreetmap/openstreetmap-website/pull/432/files#diff-25">app/models/request_token.rb</a>
(2)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/openstreetmap/openstreetmap-website/pull/432/files#diff-26">app/models/trace.rb</a>
(8)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/openstreetmap/openstreetmap-website/pull/432/files#diff-27">app/models/tracetag.rb</a>
(4)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/openstreetmap/openstreetmap-website/pull/432/files#diff-28">app/models/user.rb</a>
(34)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/openstreetmap/openstreetmap-website/pull/432/files#diff-29">app/models/user_block.rb</a>
(4)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/openstreetmap/openstreetmap-website/pull/432/files#diff-30">app/models/user_preference.rb</a>
(2)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/openstreetmap/openstreetmap-website/pull/432/files#diff-31">app/models/user_token.rb</a>
(2)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/openstreetmap/openstreetmap-website/pull/432/files#diff-32">app/models/way.rb</a>
(10)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/openstreetmap/openstreetmap-website/pull/432/files#diff-33">config/application.rb</a>
(30)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/openstreetmap/openstreetmap-website/pull/432/files#diff-34">config/environments/development.rb</a>
(34)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/openstreetmap/openstreetmap-website/pull/432/files#diff-35">config/environments/production.rb</a>
(70)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/openstreetmap/openstreetmap-website/pull/432/files#diff-36">config/environments/test.rb</a>
(27)
</li>
<li>
<strong>D</strong>
<a href="https://github.com/openstreetmap/openstreetmap-website/pull/432/files#diff-37">config/initializers/buffered_logger.rb</a>
(14)
</li>
<li>
<strong>A</strong>
<a href="https://github.com/openstreetmap/openstreetmap-website/pull/432/files#diff-38">config/initializers/filter_parameter_logging.rb</a>
(4)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/openstreetmap/openstreetmap-website/pull/432/files#diff-39">config/initializers/inflections.rb</a>
(11)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/openstreetmap/openstreetmap-website/pull/432/files#diff-40">config/initializers/paperclip.rb</a>
(3)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/openstreetmap/openstreetmap-website/pull/432/files#diff-41">config/initializers/postgresql_adapter.rb</a>
(13)
</li>
<li>
<strong>A</strong>
<a href="https://github.com/openstreetmap/openstreetmap-website/pull/432/files#diff-42">config/initializers/secret_token.rb</a>
(12)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/openstreetmap/openstreetmap-website/pull/432/files#diff-43">config/initializers/wrap_parameters.rb</a>
(12)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/openstreetmap/openstreetmap-website/pull/432/files#diff-44">config/preinitializer.rb</a>
(7)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/openstreetmap/openstreetmap-website/pull/432/files#diff-45">config/routes.rb</a>
(20)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/openstreetmap/openstreetmap-website/pull/432/files#diff-46">db/migrate/001_create_osm_db.rb</a>
(4)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/openstreetmap/openstreetmap-website/pull/432/files#diff-47">db/migrate/031_create_countries.rb</a>
(4)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/openstreetmap/openstreetmap-website/pull/432/files#diff-48">db/migrate/053_add_map_bug_tables.rb</a>
(4)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/openstreetmap/openstreetmap-website/pull/432/files#diff-49">db/migrate/054_refactor_map_bug_tables.rb</a>
(4)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/openstreetmap/openstreetmap-website/pull/432/files#diff-50">lib/classic_pagination/pagination.rb</a>
(31)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/openstreetmap/openstreetmap-website/pull/432/files#diff-51">lib/geo_record.rb</a>
(2)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/openstreetmap/openstreetmap-website/pull/432/files#diff-52">lib/redactable.rb</a>
(2)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/openstreetmap/openstreetmap-website/pull/432/files#diff-53">test/functional/amf_controller_test.rb</a>
(4)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/openstreetmap/openstreetmap-website/pull/432/files#diff-54">test/functional/browse_controller_test.rb</a>
(4)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/openstreetmap/openstreetmap-website/pull/432/files#diff-55">test/functional/changeset_controller_test.rb</a>
(16)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/openstreetmap/openstreetmap-website/pull/432/files#diff-56">test/functional/diary_entry_controller_test.rb</a>
(10)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/openstreetmap/openstreetmap-website/pull/432/files#diff-57">test/functional/message_controller_test.rb</a>
(8)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/openstreetmap/openstreetmap-website/pull/432/files#diff-58">test/functional/old_node_controller_test.rb</a>
(2)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/openstreetmap/openstreetmap-website/pull/432/files#diff-59">test/functional/trace_controller_test.rb</a>
(2)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/openstreetmap/openstreetmap-website/pull/432/files#diff-60">test/functional/user_blocks_controller_test.rb</a>
(12)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/openstreetmap/openstreetmap-website/pull/432/files#diff-61">test/functional/user_controller_test.rb</a>
(20)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/openstreetmap/openstreetmap-website/pull/432/files#diff-62">test/functional/way_controller_test.rb</a>
(2)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/openstreetmap/openstreetmap-website/pull/432/files#diff-63">test/integration/client_application_test.rb</a>
(2)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/openstreetmap/openstreetmap-website/pull/432/files#diff-64">test/integration/cors_test.rb</a>
(2)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/openstreetmap/openstreetmap-website/pull/432/files#diff-65">test/integration/oauth_test.rb</a>
(6)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/openstreetmap/openstreetmap-website/pull/432/files#diff-66">test/integration/short_links_test.rb</a>
(2)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/openstreetmap/openstreetmap-website/pull/432/files#diff-67">test/integration/user_blocks_test.rb</a>
(10)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/openstreetmap/openstreetmap-website/pull/432/files#diff-68">test/integration/user_creation_test.rb</a>
(2)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/openstreetmap/openstreetmap-website/pull/432/files#diff-69">test/integration/user_diaries_test.rb</a>
(2)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/openstreetmap/openstreetmap-website/pull/432/files#diff-70">test/integration/user_login_test.rb</a>
(2)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/openstreetmap/openstreetmap-website/pull/432/files#diff-71">test/integration/user_roles_test.rb</a>
(2)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/openstreetmap/openstreetmap-website/pull/432/files#diff-72">test/integration/user_terms_seen_test.rb</a>
(2)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/openstreetmap/openstreetmap-website/pull/432/files#diff-73">test/unit/diary_entry_test.rb</a>
(4)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/openstreetmap/openstreetmap-website/pull/432/files#diff-74">test/unit/i18n_test.rb</a>
(4)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/openstreetmap/openstreetmap-website/pull/432/files#diff-75">test/unit/node_test.rb</a>
(4)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/openstreetmap/openstreetmap-website/pull/432/files#diff-76">test/unit/oauth_token_test.rb</a>
(4)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/openstreetmap/openstreetmap-website/pull/432/files#diff-77">test/unit/trace_test.rb</a>
(4)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/openstreetmap/openstreetmap-website/pull/432/files#diff-78">test/unit/tracetag_test.rb</a>
(4)
</li>
<li>
<strong>M</strong>
<a href="https://github.com/openstreetmap/openstreetmap-website/pull/432/files#diff-79">test/unit/user_test.rb</a>
(10)
</li>
</ul>
<h4>Patch Links:</h4>
<ul>
<li><a href='https://github.com/openstreetmap/openstreetmap-website/pull/432.patch'>https://github.com/openstreetmap/openstreetmap-website/pull/432.patch</a></li>
<li><a href='https://github.com/openstreetmap/openstreetmap-website/pull/432.diff'>https://github.com/openstreetmap/openstreetmap-website/pull/432.diff</a></li>
</ul>