From 41e3c3941c962c3510fe3ad8f6cfa5f4e4736a10 Mon Sep 17 00:00:00 2001 From: Aashish Kiran Date: Wed, 14 Mar 2018 20:24:16 +0530 Subject: [PATCH] url data can be reinitialized --- README.rdoc | 5 ++++- lib/stringex/acts_as_url.rb | 7 +++++++ lib/stringex/acts_as_url/adapter/base.rb | 6 ++++++ test/unit/acts_as_url_integration_test.rb | 15 +++++++++++++++ 4 files changed, 32 insertions(+), 1 deletion(-) diff --git a/README.rdoc b/README.rdoc index ef7b173c..81739ec5 100644 --- a/README.rdoc +++ b/README.rdoc @@ -46,7 +46,10 @@ In order to use the generated url attribute, you will probably want to override Routing called via named routes like foo_path(@foo) will automatically use the url. In your controllers you will need to call Foo.find_by_url(params[:id]) instead of the regular find. Don't look for params[:url] unless you set it explicitly in the routing, to_param will generate params[:id]. -Note that if you add acts_as_url to an existing model, the url database column will initially be blank. To set this column for your existing instances, you can use the initialize_urls method. So if your class is Post, just say Post.initialize_urls. +Note that if you add acts_as_url to an existing model, the url database column will initially be blank. +To set this column for your existing instances, you can use the initialize_urls method. So if your class is Post, just say Post.initialize_urls. + +To update the existing url database column with data, you can use reinitialize_urls method. So if your class is Post, just say Post.reinitialize_urls. Unlike other permalink solutions, ActsAsUrl doesn't rely on Iconv (which is inconsistent across platforms and doesn't provide great transliteration as is) but instead uses a transliteration scheme (see the code for Unidecoder) which produces much better results for Unicode characters. It also mixes in some custom helpers to translate common characters into a more URI-friendly format rather than just dump them completely. Examples: diff --git a/lib/stringex/acts_as_url.rb b/lib/stringex/acts_as_url.rb index 67fdcdd2..ce7329be 100644 --- a/lib/stringex/acts_as_url.rb +++ b/lib/stringex/acts_as_url.rb @@ -96,6 +96,13 @@ def included(base = nil, &block) def initialize_urls acts_as_url_configuration.adapter.initialize_urls! self end + + # Initialize the url fields for the records that need it. Designed for people who want to update + # acts_as_url support once there's already development/production data they'd + # like to keep around. + def reinitialize_urls + acts_as_url_configuration.adapter.reinitialize_urls! self + end end module ActsAsUrlInstanceMethods diff --git a/lib/stringex/acts_as_url/adapter/base.rb b/lib/stringex/acts_as_url/adapter/base.rb index 0c51c7a6..b3f56b6c 100644 --- a/lib/stringex/acts_as_url/adapter/base.rb +++ b/lib/stringex/acts_as_url/adapter/base.rb @@ -33,6 +33,12 @@ def initialize_urls!(klass) end end + def reinitialize_urls!(klass) + self.klass = klass + klass.update_all(settings.url_attribute => nil) + initialize_urls!(klass) + end + def url_attribute(instance) # Retrieve from database record if there are errors on attribute_to_urlify if !is_new?(instance) && is_present?(instance.errors[settings.attribute_to_urlify]) diff --git a/test/unit/acts_as_url_integration_test.rb b/test/unit/acts_as_url_integration_test.rb index 20ae2220..a09cf4ba 100644 --- a/test/unit/acts_as_url_integration_test.rb +++ b/test/unit/acts_as_url_integration_test.rb @@ -224,6 +224,21 @@ def test_should_mass_initialize_urls assert_equal "subsequent", @other_doc.url end + def test_should_mass_reinitialize_urls + @doc = Document.create(title: "Initial") + @other_doc = Document.create(title: "Subsequent") + # Just making sure this got set before the reinitialize urls test + assert_equal "initial", @doc.url + assert_equal "subsequent", @other_doc.url + + Document.reinitialize_urls + + @doc.reload + @other_doc.reload + assert_equal "initial", @doc.url + assert_equal "subsequent", @other_doc.url + end + def test_should_mass_initialize_urls_with_custom_url_attribute Document.class_eval do # Manually undefining the url method on Document which, in a real class not reused for tests,