diff --git a/README.md b/README.md index 39f02949..48d27e97 100644 --- a/README.md +++ b/README.md @@ -72,6 +72,16 @@ post = Post.find '50b1386a0482939864000001' # Finds by bson ids ``` [Examine slug.rb](lib/mongoid/slug.rb) for all available options. +To set slugs for existing records run following rake task: + +```ruby +rake mongoid_slug:set +``` +You can pass model names as an option for which you want to set slugs: + +```ruby +rake mongoid_slug:set[Model1,Model2] +``` Custom Slug Generation ------- diff --git a/lib/mongoid/slug.rb b/lib/mongoid/slug.rb index 36eb94d1..3013e850 100644 --- a/lib/mongoid/slug.rb +++ b/lib/mongoid/slug.rb @@ -6,11 +6,17 @@ require 'mongoid/slug/unique_slug' require 'mongoid/slug/slug_id_strategy' require 'mongoid-compatibility' +require 'mongoid/slug/railtie' if defined?(Rails) module Mongoid # Slugs your Mongoid model. module Slug extend ActiveSupport::Concern + @classes = [] + + class << self + attr_accessor :classes + end included do cattr_accessor :reserved_words, @@ -22,6 +28,7 @@ module Slug # field :_slugs, type: Array, default: [], localize: false # alias_attribute :slugs, :_slugs + Mongoid::Slug.classes << self end module ClassMethods diff --git a/lib/mongoid/slug/railtie.rb b/lib/mongoid/slug/railtie.rb new file mode 100644 index 00000000..c734d714 --- /dev/null +++ b/lib/mongoid/slug/railtie.rb @@ -0,0 +1,9 @@ +module Mongoid + module Slug + class Railtie < Rails::Railtie + rake_tasks do + Dir[File.join(File.dirname(__FILE__), '../../tasks/*.rake')].each { |f| load f } + end + end + end +end diff --git a/lib/tasks/mongoid_slug.rake b/lib/tasks/mongoid_slug.rake new file mode 100644 index 00000000..81f31d02 --- /dev/null +++ b/lib/tasks/mongoid_slug.rake @@ -0,0 +1,16 @@ +namespace :mongoid_slug do + desc 'Goes though all documents and sets slug if not already set' + task set: :environment do |_, args| + ::Rails.application.eager_load! if defined?(Rails) + unless Mongoid::Slug.classes.blank? + models = args.extras + klasses = Mongoid::Slug.classes + klasses = (klasses.map(&:to_s) & models.map(&:classify)).map(&:constantize) unless models.blank? + klasses.each do |klass| + # set slug for objects having blank slug + klass.each { |object| object.set_slug! unless object.slugs? } + end + end + p 'Completed mongoid_slug:set' + end +end diff --git a/spec/models/uninitalized_slug_first.rb b/spec/models/uninitalized_slug_first.rb new file mode 100644 index 00000000..d0ee458b --- /dev/null +++ b/spec/models/uninitalized_slug_first.rb @@ -0,0 +1,5 @@ +class UninitalizedSlugFirst + include Mongoid::Document + field :_id, type: Integer + field :name, type: String +end diff --git a/spec/models/uninitalized_slug_second.rb b/spec/models/uninitalized_slug_second.rb new file mode 100644 index 00000000..10d56c94 --- /dev/null +++ b/spec/models/uninitalized_slug_second.rb @@ -0,0 +1,5 @@ +class UninitalizedSlugSecond + include Mongoid::Document + field :_id, type: Integer + field :name, type: String +end diff --git a/spec/models/uninitalized_slug_third.rb b/spec/models/uninitalized_slug_third.rb new file mode 100644 index 00000000..d17ed11f --- /dev/null +++ b/spec/models/uninitalized_slug_third.rb @@ -0,0 +1,5 @@ +class UninitalizedSlugThird + include Mongoid::Document + field :_id, type: Integer + field :name, type: String +end diff --git a/spec/tasks/mongoid_slug_rake_spec.rb b/spec/tasks/mongoid_slug_rake_spec.rb new file mode 100644 index 00000000..835fdf77 --- /dev/null +++ b/spec/tasks/mongoid_slug_rake_spec.rb @@ -0,0 +1,52 @@ +require 'spec_helper' +require 'rake' + +describe 'mongoid_slug:set' do + before :all do + load File.expand_path('../../../lib/tasks/mongoid_slug.rake', __FILE__) + Rake::Task.define_task(:environment) + end + + context 'when models parameter is passed' do + let!(:uninitalized_slug1) { UninitalizedSlugFirst.create(id: 455, name: 'uninitalized_slug1') } + let!(:uninitalized_slug2) { UninitalizedSlugSecond.create(id: 456, name: 'uninitalized_slug2') } + + it 'Goes though all documents of passed models and sets slug if not already set' do + class UninitalizedSlugFirst + include Mongoid::Slug + slug :name + end + + class UninitalizedSlugSecond + include Mongoid::Slug + slug :name + end + + expect(uninitalized_slug1.slugs).to be_nil + expect(uninitalized_slug2.slugs).to be_nil + + Rake::Task['mongoid_slug:set'].reenable + Rake::Task['mongoid_slug:set'].invoke('UninitalizedSlugFirst') + + expect(uninitalized_slug1.reload.slugs).to eq(['uninitalized-slug1']) + expect(uninitalized_slug2.reload.slugs).to eq [] + end + end + + context 'when models parameter is not passed' do + let!(:uninitalized_slug3) { UninitalizedSlugThird.create(id: 70, name: 'uninitalized_slug3') } + + it 'Goes though all documents and sets slug if not already set' do + class UninitalizedSlugThird + include Mongoid::Slug + slug :name + end + expect(uninitalized_slug3.slugs).to be_nil + + Rake::Task['mongoid_slug:set'].reenable + Rake::Task['mongoid_slug:set'].invoke + + expect(uninitalized_slug3.reload.slugs).to eq(['uninitalized-slug3']) + end + end +end