document.write('<link rel="stylesheet" href="http://flowcoder.com/stylesheets/pygment_trac.css" />');
document.write('<link rel="stylesheet" href="http://flowcoder.com/stylesheets/embed.css" />');
document.write('<div class="flowcoder_post flowcoder_clearfix">');
document.write('<div class="flowcoder_posttitle"><a href=\"http://flowcoder.com/163\">Automatic slug generation advanced with de-dupe technology<\/a></div>');
document.write('<div class="flowcoder_postbody flowcoder_syntax"><div class=\"highlight\"><pre><span class=\"c1\"># I&#39;m not sure if there&#39;s a better way to do this, but it works...<\/span>\n\n<span class=\"c1\"># The tests look like:<\/span>\n\n  <span class=\"nb\">test<\/span> <span class=\"s2\">&quot;deals with dupe slugs automatically&quot;<\/span> <span class=\"k\">do<\/span>\n    <span class=\"n\">v1<\/span> <span class=\"o\">=<\/span> <span class=\"no\">Video<\/span><span class=\"o\">.<\/span><span class=\"n\">make<\/span><span class=\"p\">(<\/span><span class=\"ss\">:name<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"s2\">&quot;Nick Vegas&quot;<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">v2<\/span> <span class=\"o\">=<\/span> <span class=\"no\">Video<\/span><span class=\"o\">.<\/span><span class=\"n\">make<\/span><span class=\"p\">(<\/span><span class=\"ss\">:name<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"s2\">&quot;Nick Vegas&quot;<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">v3<\/span> <span class=\"o\">=<\/span> <span class=\"no\">Video<\/span><span class=\"o\">.<\/span><span class=\"n\">make<\/span><span class=\"p\">(<\/span><span class=\"ss\">:name<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"s2\">&quot;Nick Vegas&quot;<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">assert_equal<\/span> <span class=\"s2\">&quot;nickvegas&quot;<\/span><span class=\"p\">,<\/span> <span class=\"n\">v1<\/span><span class=\"o\">.<\/span><span class=\"n\">slug<\/span>\n    <span class=\"n\">assert_equal<\/span> <span class=\"s2\">&quot;nickvegas2&quot;<\/span><span class=\"p\">,<\/span> <span class=\"n\">v2<\/span><span class=\"o\">.<\/span><span class=\"n\">slug<\/span>\n    <span class=\"n\">assert_equal<\/span> <span class=\"s2\">&quot;nickvegas3&quot;<\/span><span class=\"p\">,<\/span> <span class=\"n\">v3<\/span><span class=\"o\">.<\/span><span class=\"n\">slug<\/span>\n  <span class=\"k\">end<\/span>\n\n<span class=\"c1\"># The model and relevant code looks like:<\/span>\n\n<span class=\"k\">class<\/span> <span class=\"nc\">Video<\/span> <span class=\"o\">&lt;<\/span> <span class=\"no\">ActiveRecord<\/span><span class=\"o\">::<\/span><span class=\"no\">Base<\/span>\n  <span class=\"n\">before_validation<\/span> <span class=\"ss\">:generate_slug<\/span>\n  <span class=\"n\">validates_presence_of<\/span> <span class=\"ss\">:slug<\/span>\n  <span class=\"n\">validates_uniqueness_of<\/span> <span class=\"ss\">:slug<\/span>\n  \n  <span class=\"k\">def<\/span> <span class=\"nf\">generate_slug<\/span>\n    <span class=\"n\">slug<\/span> <span class=\"o\">=<\/span> <span class=\"nb\">name<\/span><span class=\"o\">.<\/span><span class=\"n\">parameterize<\/span><span class=\"o\">.<\/span><span class=\"n\">gsub<\/span><span class=\"p\">(<\/span><span class=\"s1\">&#39;-&#39;<\/span><span class=\"p\">,<\/span> <span class=\"s1\">&#39;&#39;<\/span><span class=\"p\">)<\/span>\n    <span class=\"k\">if<\/span> <span class=\"no\">Video<\/span><span class=\"o\">.<\/span><span class=\"n\">find_by_slug<\/span><span class=\"p\">(<\/span><span class=\"n\">slug<\/span><span class=\"p\">)<\/span>\n      <span class=\"n\">counter<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">2<\/span>\n      <span class=\"k\">until<\/span> <span class=\"no\">Video<\/span><span class=\"o\">.<\/span><span class=\"n\">find_by_slug<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;<\/span><span class=\"si\">#{<\/span><span class=\"n\">slug<\/span><span class=\"si\">}#{<\/span><span class=\"n\">counter<\/span><span class=\"si\">}<\/span><span class=\"s2\">&quot;<\/span><span class=\"p\">)<\/span><span class=\"o\">.<\/span><span class=\"n\">nil?<\/span>\n        <span class=\"n\">counter<\/span> <span class=\"o\">+=<\/span> <span class=\"mi\">1<\/span>\n      <span class=\"k\">end<\/span>\n      <span class=\"n\">slug<\/span> <span class=\"o\">=<\/span> <span class=\"s2\">&quot;<\/span><span class=\"si\">#{<\/span><span class=\"n\">slug<\/span><span class=\"si\">}#{<\/span><span class=\"n\">counter<\/span><span class=\"si\">}<\/span><span class=\"s2\">&quot;<\/span>\n    <span class=\"k\">end<\/span>\n    <span class=\"nb\">self<\/span><span class=\"o\">.<\/span><span class=\"n\">slug<\/span> <span class=\"o\">=<\/span> <span class=\"n\">slug<\/span>\n  <span class=\"k\">rescue<\/span>\n    <span class=\"c1\"># use validations to catch errors<\/span>\n  <span class=\"k\">end<\/span>   \n<span class=\"k\">end<\/span>\n<\/pre><\/div>\n</div>');
document.write('<div class="flowcoder_bottombar flowcoder_clearfix">');
document.write('<div class="flowcoder_postedby">Posted by <a href=\"http://flowcoder.com/trevorturk\">trevorturk<\/a> on <a href=\"http://flowcoder.com/\">Flowcoder<\/a></div>');
document.write('<div class="flowcoder_viewraw"><a href=\"http://flowcoder.com/163.txt\">view raw<\/a></div>');
document.write('</div></div>');