Skip to content

Instantly share code, notes, and snippets.

@danvega
Created April 1, 2014 12:14
Show Gist options
  • Save danvega/9912759 to your computer and use it in GitHub Desktop.
Save danvega/9912759 to your computer and use it in GitHub Desktop.
Blog Post Sample
<div class="entry">
<p>I am working on coverting this site over to a grails applicaiton. While there are some good plugins out there I could of taken advantage of I decided to use this as a learning experience and write a ton of it from scratch. </p>
<p>For the blog post itself we have some unique URLs that look like this
</p><blockquote>/blog/2014/3/30/Grails-views-Controller-and-Action-name</blockquote>
This converts to /blog/year/month/day/slug. So first thing I needed to was setup a url mapping for this path. I also put some constraints on the parameters so we get exactly what we are looking for.
<pre class=" language-groovy"><code class=" language-groovy"><span class="token comment" spellcheck="true">
// blog post
</span><span class="token string gstring">"/blog/<span class="token expression"><span class="token punctuation">$</span>year</span>?/<span class="token expression"><span class="token punctuation">$</span>month</span>?/<span class="token expression"><span class="token punctuation">$</span>day</span>?/<span class="token expression"><span class="token punctuation">$</span>slug</span>?"</span><span class="token punctuation">(</span>controller<span class="token punctuation">:</span><span class="token string gstring">"blog"</span><span class="token punctuation">,</span> action<span class="token punctuation">:</span><span class="token string gstring">"show"</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
constraints <span class="token punctuation">{</span>
year matches<span class="token punctuation">:</span><span class="token string regex">/\d{4}/</span>
month matches<span class="token punctuation">:</span><span class="token string regex">/\d{1,2}/</span>
day matches<span class="token punctuation">:</span><span class="token string regex">/\d{1,2}/</span>
slug matches<span class="token punctuation">:</span> <span class="token string regex">/^[a-z0-9-]+<span class="token expression"><span class="token punctuation">$</span></span>/</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre>
<p></p><more><p>Now in our controller or event our views I could do something like this to create a link to that blog post. This is going to be a big pain every single time I need to link to a post.
</p><pre><code class="language-html">
<div class="blog">
<g:each in="${posts}" var="post">
<div class="entry">
<h2>
<a href="
${createLink(
uri:" blog="" $post.datecreated[calendar.year]="" $post.datecreated[calendar.month]="" $post.datecreated[calendar.date]="" $post.slug")}"="">
${post.title}
</a>
</h2>
<g:if test="${post.teaser}">
${raw(post.teaser)}
</g:if>
<g:else>
${raw(post.content)}
</g:else>
</div>
</g:each>
</div>
</code></pre>
<p></p>
<p>So i set out to find an easier way to do this. It seems like the post object itself should know how to create its own link. So wouldn't it be nice if we could call post.createPermaLink()? I think that would be great so let's do it. First off we have no access to that createLink method in our domain class. We do however have ability to inject the <a href="http://grails.org/doc/2.0.x/api/org/codehaus/groovy/grails/web/mapping/LinkGenerator.html" target="_blank">LinkGenerator</a> class and this class has a method called link that will do exactly what we are looking for. First thing we need to do is inject that class into our domain object as a transient property.
</p><pre class=" language-groovy"><code class=" language-groovy">
<span class="token keyword">package</span> com<span class="token operator">.</span>vega<span class="token operator">.</span>blog
<span class="token keyword">import</span> com<span class="token operator">.</span>vega<span class="token operator">.</span>auth<span class="token operator">.</span>User
<span class="token keyword">import</span> org<span class="token operator">.</span>grails<span class="token operator">.</span>comments<span class="token operator">.</span>Commentable
<span class="token keyword">import</span> org<span class="token operator">.</span>grails<span class="token operator">.</span>taggable<span class="token operator">.</span>Taggable
<span class="token keyword">import</span> org<span class="token operator">.</span>codehaus<span class="token operator">.</span>groovy<span class="token operator">.</span>grails<span class="token operator">.</span>web<span class="token operator">.</span>mapping<span class="token operator">.</span>LinkGenerator
<span class="token keyword">class</span> <span class="token class-name">Post</span> <span class="token keyword">implements</span> <span class="token class-name">Commentable</span><span class="token punctuation">,</span>Taggable <span class="token punctuation">{</span>
<span class="token keyword">static</span> <span class="token keyword">transient</span> LinkGenerator grailsLinkGenerator
<span class="token punctuation">}</span>
</code></pre>
Now we can create out method and use this class to generate this link for us.
<pre class=" language-groovy"><code class=" language-groovy">
<span class="token comment" spellcheck="true">/**
* Utility method that will handle creating a link to this post
* @return String
*/</span>
String <span class="token function">createPermalink<span class="token punctuation">(</span></span><span class="token punctuation">)</span><span class="token punctuation">{</span>
<span class="token keyword">def</span> year <span class="token operator">=</span> dateCreated<span class="token punctuation">[</span>Calendar<span class="token operator">.</span>YEAR<span class="token punctuation">]</span>
<span class="token keyword">def</span> month <span class="token operator">=</span> dateCreated<span class="token punctuation">[</span>Calendar<span class="token operator">.</span>MONTH<span class="token punctuation">]</span>
<span class="token keyword">def</span> day <span class="token operator">=</span> dateCreated<span class="token punctuation">[</span>Calendar<span class="token operator">.</span>DATE<span class="token punctuation">]</span>
grailsLinkGenerator<span class="token punctuation">.</span><span class="token function">link<span class="token punctuation">(</span></span>uri<span class="token punctuation">:</span><span class="token string gstring">"/blog/<span class="token expression"><span class="token punctuation">$</span>year</span>/<span class="token expression"><span class="token punctuation">$</span>month</span>/<span class="token expression"><span class="token punctuation">$</span>day</span>/<span class="token expression"><span class="token punctuation">$</span>slug</span>"</span><span class="token punctuation">)</span>
<span class="token punctuation">}</span>
</code></pre>
Finally in our view we have an easy way to generate that link. Pretty cool right?
<pre><code class="language-html">
<div class="blog">
<g:each in="${posts}" var="post">
<div class="entry">
<h2><a href="${post.createPermalink()}">${post.title}</a></h2>
<g:if test="${post.teaser}">
${raw(post.teaser)}
</g:if>
<g:else>
${raw(post.content)}
</g:else>
</div>
</g:each>
</div>
</code></pre>
</div>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment