diff --git a/README.rdoc b/README.rdoc index ef7b173c..a4fe5410 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 which has 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: @@ -130,7 +133,7 @@ If you don't want to use the Stringex built-in translations, you can force Strin You'll need to add a :find_by => :url to your load_and_authorize_resource. Here's an example: load_and_authorize_resource :class => "Whatever", :message => "Not authorized", :find_by => :url - + == Semantic Versioning This project conforms to [semver](http://semver.org/). As a result of this policy, you can (and should) specify a dependency on this gem using the [Pessimistic Version Constraint](http://guides.rubygems.org/patterns/) with two digits of precision. For example: diff --git a/lib/stringex/acts_as_url.rb b/lib/stringex/acts_as_url.rb index 67fdcdd2..2b51e201 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 + + # Renitialize the url fields for the all records. 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,