44
55module Spree
66 class Taxon < Spree ::Base
7+ extend FriendlyId
8+ friendly_id :permalink , use : :history , slug_column : :permalink
9+
710 acts_as_nested_set dependent : :destroy
811
912 belongs_to :taxonomy , class_name : 'Spree::Taxonomy' , inverse_of : :taxons
@@ -13,8 +16,7 @@ class Taxon < Spree::Base
1316 has_many :promotion_rule_taxons
1417 has_many :promotion_rules , through : :promotion_rule_taxons
1518
16- before_create :set_permalink
17- before_update :set_permalink
19+ before_save :set_permalink
1820 after_update :update_child_permalinks , if : :saved_change_to_permalink?
1921
2022 validates :name , presence : true
@@ -121,6 +123,24 @@ def permalink_part=(value)
121123 end
122124 end
123125
126+ # override for {FriendlyId::Slugged#should_generate_new_friendly_id?} method,
127+ # to control exactly when new friendly ids are set or updated
128+ def should_generate_new_friendly_id?
129+ permalink_changed? || super
130+ end
131+
132+ # override for {FriendlyId::Slugged#normalize_friendly_id} method,
133+ # to control over the slug format
134+ def normalize_friendly_id ( value )
135+ return '' if value . blank?
136+
137+ parts = value . to_s . split ( '/' )
138+ last_word = parts . pop
139+ corrected_last_word = Spree ::Config . taxon_url_parametizer_class . parameterize ( last_word )
140+
141+ ( parts << corrected_last_word ) . join ( '/' )
142+ end
143+
124144 private
125145
126146 def touch_ancestors_and_taxonomy
0 commit comments